检查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 的使用(可分别集成到VS和QT Creator里)