Macros 检查C代码时cppcheck不展开宏?

Macros 检查C代码时cppcheck不展开宏?,macros,expand,static-code-analysis,cppcheck,Macros,Expand,Static Code Analysis,Cppcheck,我有如下代码,我使用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); } #如果(p){FREE(

我有如下代码,我使用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);
}
#如果(p){FREE(p);(p)=NULL;}定义MY_FREE(p)
对于(i=0;i项);
}
但如果我直接展开宏“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);
}
for(i=0;iitem);
}

是否有任何配置可以解决此问题?

我是一名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);
    }
}
#如果(p){FREE(p);(p)=NULL;}定义MY_FREE(p)
void f(){
结构数据*数据;
对于(i=0;i项);
}
}
报告警告:

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


在您的代码中。。听上去我们有假阴性是出于某种原因。

谢谢你的评论。请将“其他进程(数据->项目)”替换为“其他进程0(数据);其他进程1(数据->项目)”,然后再试一次,不知道是什么
other\u进程0(数据)为空,它可能会重新分配
数据
,使其不再为空。因此,Cppcheck不会对此发出警告。即使
数据
可能在
其他进程0
中重新分配,也不可能在
f()
中更改
数据
,对吗
other_process0
可以是宏。宏
MY_FREE
分配
数据
。这是一种非常常见的模式,我们必须假设它可能是一个宏。如果为
other_process0
添加函数/宏声明,您应该会看到警告。无论如何我确信Cppcheck应该检测到一些bug,但没有检测到,这是非常不幸的。如果你看到这样的错误,那么我想知道它。这需要“数据流分析”,而且永远不会有一个工具能够完美地做到这一点。