【问题标题】:cppcheck does not expand macro when checking C code?检查C代码时cppcheck不扩展宏?
【发布时间】: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);
}

有什么配置可以解决吗?

【问题讨论】:

    标签: macros expand static-code-analysis cppcheck


    【解决方案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 应该检测到但未能检测到的错误,这是非常不幸的。如果你看到这样的错误,那么我想知道它。这需要“数据流分析”,而且永远不会有一个工具可以完美地做到这一点。
    猜你喜欢
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多