4

我有一个驱动 cppcheck 疯狂的代码片段,因为它没有看到日志调用中使用的变量。所以我得到未使用的变量和范围缩小警告:

    double start = GetTimeOfDayDoubleSec(), afterDb = 0;
    if (LoadFromDatabase(serials)) {
        afterDb = GetTimeOfDayDoubleSec();
        Cache.ResetDebugFlags(serials);
    }
    double end = GetTimeOfDayDoubleSec();
    ZLOG_INFO("DB time  %f, total %f", afterDb ? afterDb - start : 0, end - start);

Cppcheck 说:

The scope of the variable 'afterDb' can be reduced.
Variable 'afterDb' is assigned a value that is never used.

我无法找出抑制这两种方法的语法,而且手册也无济于事。单独的行、空格、逗号、冒号和分号都失败。单独的行给了我“不匹配的抑制”,其余的都是无效的:

    //cppcheck-suppress variableScope
    //cppcheck-suppress unreadVariable
    //cppcheck-suppress variableScope unreadVariable
    //cppcheck-suppress variableScope,unreadVariable
    //cppcheck-suppress variableScope;unreadVariable
    double afterDb = 0;

 Failed to add suppression. Invalid id "variableScope:unreadVariable"

cppcheck 是否让我内联执行此操作,还是必须在命令行上使用 XML 执行此操作?


cppcheck-gui 工具栏

抱歉,事实证明存在一个令人困惑的问题:在 cppcheck-gui 中点击“刷新”并不能刷新所有内容,我必须重新加载 cppcheck 文件以获取要更新的抑制更改。即,工具栏上的“打开文件”图标而不是右侧的“刷新”图标。

事实证明,空间分隔有效:

//cppcheck-suppress variableScope unreadVariable
4

3 回答 3

4

空格分隔确实有效:

//cppcheck-suppress variableScope unreadVariable

这被在 cppcheck-gui 中点击“刷新”并没有真正刷新所有内容的问题所隐藏,我必须重新加载 cppcheck 文件。

于 2015-02-16T21:27:02.620 回答
2

首先...当我阅读您的代码时,在我看来,Cppcheck 编写了 FP。我们不应该警告该代码,不是吗?我希望 FP 是固定的。我复制并粘贴了您的代码,但未能为它重现 FP - 所以您的真实代码中可能有一些东西让 Cppcheck 感到困惑。

内联抑制的代码在 cppcheck 预处理器中(在 lib/preprocessor.cpp 文件中搜索“cppcheck-suppress”)。据我所知,您目前不能使用多个内联抑制。

如果您有时间并想帮助我们,请随时:

我会说空格分隔的内联抑制会很好。

cppcheck 是否让我内联执行此操作,还是必须在命令行上使用 XML 执行此操作?

也许这就是你的意思..但你可以使用--suppress 或--suppressions-list。

于 2015-02-16T08:51:01.753 回答
2

要在同一行上使用多个抑制,请使用逗号分隔的列表。

手册

arr[10] = arr[10] / 0; // cppcheck-suppress[arrayIndexOutOfBounds,zerodiv]

您还可以堆叠抑制:

// cppcheck-suppress arrayIndexOutOfBounds
// cppcheck-suppress zerodiv
arr[10] = arr[10] / 0;
于 2020-07-09T18:49:51.730 回答