Macros 检查C代码时cppcheck不展开宏?
我有如下代码,我使用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(
#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,但没有检测到,这是非常不幸的。如果你看到这样的错误,那么我想知道它。这需要“数据流分析”,而且永远不会有一个工具能够完美地做到这一点。