抑制一行中的多个警告?

Posted

技术标签:

【中文标题】抑制一行中的多个警告?【英文标题】:Suppress multiple warnings from one line? 【发布时间】:2015-02-16 02:20:34 【问题描述】:

我有一个驱动 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 文件以获取要更新的抑制更改。即工具栏上的“打开文件”图标,而不是右手边的“刷新”图标。

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

//cppcheck-suppress variableScope unreadVariable

【问题讨论】:

【参考方案1】:

空格分隔确实有效:

//cppcheck-suppress variableScope unreadVariable

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

【讨论】:

如果它以前有效,它不再有效。您的示例产生:Bad suppression attribute 'unreadVariable'. You can write comments in the comment after a ; or //. Valid suppression attributes; symbolName=sym [preprocessorErrorDirective] 确实,它不再起作用了。按照@pixelgrease 的回答建议使用//cppcheck-suppress [variableScope,unreadVariable] 我已将接受的答案切换为匹配【参考方案2】:

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

来自manual:

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

你也可以叠加抑制:

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

【讨论】:

【参考方案3】:

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

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

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

在我们的 trac http://trac.cppcheck.net 中创建票证并附上修复此问题的补丁。 或者,在 github 存储库 http://github.com/danmar/cppcheck 中创建一个拉取请求来解决此问题。

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

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

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

【讨论】:

如果有帮助,我的代码实际上包装了 zlog 并隐藏了详细信息(我之前更改过日志库,除非你使用宏换行,否则很烦人),所以有 MY_LOG 宏 -> dzlog_trace 宏 -> extern C dzlog() 并且唯一真正包含zlog的文件是我的日志头文件(但它是头文件,而不是c文件,我一直无法隐藏那么多zlog)。 并查看我的编辑/答案:cppcheck 已经按照您的建议进行了 :) 这意味着这是直观的解决方案(也是我的第一个猜测,但我“测试”但没有意识到我必须这样做重新加载文件不仅仅是点击刷新,所以它不起作用)

以上是关于抑制一行中的多个警告?的主要内容,如果未能解决你的问题,请参考以下文章

正确抑制数据表中的警告?

抑制 R 中的 C 警告消息

有没有办法抑制 Xcode 中的警告?

抑制 JSHint / JSLint 或替代服务中的“混合空格和制表符”警告?

抑制 Xcode 中的运行时自动布局警告

SonarQube:如何抑制 Kotlin 代码中的警告