C:Cppcheck:可能的零点取消引用

问题描述:

因此,在main.c中,我得到了这部分代码,它打印加密的内容,如果它不为空。它非常简单。C:Cppcheck:可能的零点取消引用

CPP的错误是:

[main.c中:40]:(误差)可能的空指针:加密 - 否则它是多余的,以检查是否加密是在管线31

代码:

char* encrypted = bmp_encrypt(key, text); 
    if(encrypted != NULL) //error points here (line 31) 
    { 
     printf("Encrypted:"); 
     for(int i=0; i<strlen(text);i++) 
     { 
      printf("%x ", (unsigned char) encrypted[i]); 
     } 
     printf("\n"); 
    } 
    else{printf("Encrypted:%s\n", encrypted);} //this is line 40 

事情是,它的工作如预期,但cppcheck一直缠着我,我应该修复它?这是否是错误的?

+0

如果你到了40行,'encrypted'肯定是空的,'的printf(“加密: %s \ n“,加密)'是未定义的行为。 – aschepler

只有当encrypted为NULL时,才会输入代码的else块。所以你传递一个NULL指针到printf。这可以调用undefined behavior

既然你知道指针是在这一点上NULL,只是明确地打印为NULL:

else{printf("Encrypted: (null)\n");} 
+0

我明白了,谢谢你,我有这个printf,所以我可以看看它是否返回null,但这应该工作! – Mathue24

+0

@ Mathue24很高兴我能帮到你。如果您觉得它有用,请随时[接受此答案](http://*.com/help/accepted-answer)。 – dbush

+0

@ Mathue24:注意,如果你传递一个NULL字符串,glibc会让你输出'(null)',这不是标准规定的,gcc本身通常会重新调用'puts'调用'printf'调用,如果传递NULL,它会直接崩溃。如果您需要添加调试打印以查看该字符串是否不为NULL,请按上图所示进行操作。 –