C: Cppcheck : 可能的空点取消引用
Posted
技术标签:
【中文标题】C: Cppcheck : 可能的空点取消引用【英文标题】:C: Cppcheck : Possible null point dereference 【发布时间】:2017-04-06 20:13:28 【问题描述】:所以在 main.c 中,我得到了打印加密内容的这部分代码如果它不为空。就这么简单。
cpp 错误是:
[main.c:40]:(错误)可能的空指针取消引用:加密 - 否则在第 31 行检查 encrypted 是否为空是多余的
代码:
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");
elseprintf("Encrypted:%s\n", encrypted); //this is line 40
问题是,它按预期工作,但 cppcheck 一直在困扰我,我应该修复它吗?这样做有错吗?
【问题讨论】:
如果到第 40 行,encrypted
肯定是 null,printf("Encrypted:%s\n", encrypted)
是未定义的行为。
【参考方案1】:
只有当 encrypted
为 NULL 时,才会输入代码的 else
块。因此,您将 NULL 指针传递给 printf
。那可以调用undefined behavior。
既然你知道此时指针为 NULL,只需显式打印它为 NULL:
elseprintf("Encrypted: (null)\n");
【讨论】:
@Mathue24:请注意,如果您传递一个 NULL 字符串,glibc 会让您打印(null)
只是一种礼貌 - 它不是标准强制要求的,而且 gcc 本身通常会重写 printf
调用puts
调用,如果传递 NULL,它会直接崩溃。如果您需要添加调试打印以查看字符串是否不为 NULL,请如上所示显式执行。以上是关于C: Cppcheck : 可能的空点取消引用的主要内容,如果未能解决你的问题,请参考以下文章