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 : 可能的空点取消引用的主要内容,如果未能解决你的问题,请参考以下文章

cppcheck 取消引用空指针

cppcheck 空指针取消引用,但它实际上可以变为空

条件是多余的,或者可能存在空指针取消引用

什么是取消引用可能的空指针?

如何通过 Cppcheck 解释 Null 指针取消引用?

如何在声纳中解决这个“可能的空指针取消引用”关键问题?