检查C代码时cppcheck不扩展宏?

Posted

技术标签:

【中文标题】检查C代码时cppcheck不扩展宏?【英文标题】:cppcheck does not expand macro when checking C code? 【发布时间】:2018-01-24 07:06:48 【问题描述】:

我有如下代码,我使用 cppcheck 进行静态分析。 我发现它无法报告数据的空指针。

#define MY_FREE(p) if(p) free(p);(p)=NULL;

for(i=0; i<10; i++)

    ret = list_insert(list, data);
    if (1 != ret)
    
        MY_FREE(data);
    

    other_process(data->item);

但如果我直接展开宏“MY_FREE”,它就起作用了。

for(i=0; i<10; i++)

    ret = list_insert(list, data);
    if (1 != ret)
    
        if(data) free(data);(data)=NULL;;
    

    other_process(data->item);

有什么配置可以解决吗?

【问题讨论】:

【参考方案1】:

我是一名 Cppcheck 开发人员。您测试的确切代码是什么? Cppcheck 警告此代码:

#define MY_FREE(p) if(p) free(p);(p)=NULL;

void f() 
    struct Data *data;
    for(i=0; i<10; i++)
    
        ret = list_insert(list, data);
        if (1 != ret)
        
             MY_FREE(data);
        
        other_process(data->item);
    

报告的警告:

[1.c:12]:(警告)可能的空指针取消引用:数据

在您的代码中.. 听起来我们出于某种原因有误报。

【讨论】:

感谢您的评论。能否请您替换“other_process(data->item);”用“other_process0(data); other_process1(data->item);”,然后再试一次? 不知道other_process0(data); 做了什么,它可能会重新分配data 所以它不再是NULL。因此 Cppcheck 不会对此发出警告。 即使data 可能在other_process0 中重新分配,也不可能在f() 中更改data,对吧? 差不多。 other_process0 可能是一个宏。宏MY_FREE 分配data。这是一种常见的模式,我们不得不假设它可能是一个宏。如果您为other_process0 添加函数/宏声明,您应该会看到警告。无论如何.. 我确信 Cppcheck 应该检测到但未能检测到的错误,这是非常不幸的。如果你看到这样的错误,那么我想知道它。这需要“数据流分析”,而且永远不会有一个工具可以完美地做到这一点。

以上是关于检查C代码时cppcheck不扩展宏?的主要内容,如果未能解决你的问题,请参考以下文章

cppcheck使用大全

静态代码检查工具 cppcheck 的使用(可分别集成到VS和QT Creator里)

cppcheck静态代码检查工具使用教程

cppcheck静态代码检查工具使用教程

cppcheck 为宏查找“冗余代码:找到以数字常量开头的语句”

C++代码审查工具Cppcheck和TscanCode