使用 Jenkins 在 cppcheck 中重复相同的文件、行和错误

Posted

技术标签:

【中文标题】使用 Jenkins 在 cppcheck 中重复相同的文件、行和错误【英文标题】:Repeating the same files, lines and errors in cppcheck with Jenkins 【发布时间】:2020-07-20 09:18:55 【问题描述】:

我在 Jenkins 中运行 cppcheck 以获得 Visual Studio 解决方案。

不幸的是,我反复出现错误,因此 cppcheck-run 的结果如下所示:

FileXYZ.h line 91  error    memsetClass false   Using 'memset' on class that contains a 'std::string'
FileXYZ.h line 92  error    memsetClass false   Using 'memset' on class that contains a 'std::string'
FileXYZ.h line 91  error    memsetClass false   Using 'memset' on class that contains a 'std::string'
FileXYZ.h line 92  error    memsetClass false   Using 'memset' on class that contains a 'std::string'
FileXYZ.h line 91  error    memsetClass false   Using 'memset' on class that contains a 'std::string'
FileXYZ.h line 92  error    memsetClass false   Using 'memset' on class that contains a 'std::string'
FileXYZ.h line 91  error    memsetClass false   Using 'memset' on class that contains a 'std::string'
FileXYZ.h line 92  error    memsetClass false   Using 'memset' on class that contains a 'std::string'

这是我的 Jenkins shell 命令:

cppcheck --project="C:\FancyCode.sln" --xml --xml-version=2 $WORKSPACE 2> cppcheck.xml

我想知道是不是因为解析了解决方案文件以及其中包含的所有标题?

我只是使用了不正确的标志吗?我认为不主动启用所有功能就足够了......

我想让它们被提及一次,也在摘要中,而不是重复 600 次。

感谢您的努力和时间!

================================================ ============================== 编辑:

这是 xml 文件的输出。首先它显示了一些没有 xml 样式正文的乱码:

memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' ......更多相同的...... varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA varA varA hServSock memset 'std::chrono::time_point' varA varA pProcessName pProcessName memset 'std::chrono::time_point' memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA newBody newBody newBody newBody memset 'std::chrono::time_point' varA varA varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA varA varA varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' 内存集 'std::string' 内存集 'std::string' memset 'std::string' memset 'std::string' varA varA memset 'std::chrono::time_point' 内存集 'std::string' 内存集 'std::string' memset 'std::string' memset 'std::string' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' memset 'std::string' memset 'std::string' memset 'std::string' memset 'std::string' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' 内存集 'std::string' 内存集 'std::string' memset 'std::string' memset 'std::string' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' 内存集 'std::chrono::time_point' 内存集 'std::chrono::time_point' memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' memset 'std::string' memset 'std::string' memset 'std::string' memset 'std::string' varA varA memset 'std::chrono::time_point' memset 'std::string' memset 'std::string' 内存集 'std::string' 内存集 'std::string' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' 内存集 'std::chrono::time_point' 内存集 'std::chrono::time_point' varA varA mode mode memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA memset 'std::chrono::time_point' varA varA 此 XML 文件 似乎没有任何与之关联的样式信息。这 文档树如下所示。

然后它会进一步使用 cppcheck 的 xml 样式输出,但它也会在那里重复错误。正如我所看到的,它也会做出这样的事情:

File123.h line 132  error   memsetClass false   Using 'memset' on class that contains a 'std::string'
FileXYZ.h line 91  error    memsetClass false   Using 'memset' on class that contains a 'std::string'
FileXYZ.h line 92  error    memsetClass false   Using 'memset' on class that contains a 'std::string'
File123.h line 132  error   memsetClass false   Using 'memset' on class that contains a 'std::string'
FileXYZ.h line 91  error    memsetClass false   Using 'memset' on class that contains a 'std::string'
FileXYZ.h line 92  error    memsetClass false   Using 'memset' on class that contains a 'std::string'
FileXYZ.h line 91  error    memsetClass false   Using 'memset' on class that contains a 'std::string'
FileXYZ.h line 92  error    memsetClass false   Using 'memset' on class that contains a 'std::string'
File123.h line 132  error   memsetClass false   Using 'memset' on class that contains a 'std::string'

这可能是计时错误的具体问题吗?我将尝试使用计时错误排除此文件,如果解决了它,我将向 cppcheck 写一个错误报告?!

谢谢,如果你有其他想法,我会很高兴,因为这样 cppcheck 在 Jenkins 中是没用的。

【问题讨论】:

【参考方案1】:

我是一名 Cppcheck 开发人员。

我不确定您为什么会出现这种行为。我们会尽量避免重复警告。

我无法立即重现此内容。我试图在我们的一个标题中添加一个错误.. 并且仅在我测试时报告一次(我使用 --project 导入了一个 Visual Studio 项目)。

xml 输出中的错误有什么不同吗?

【讨论】:

我在编辑下放了一些 xml 的更多信息。如果我必须提交错误报告,我会这样做。感谢您的支持! 随时提交错误报告。但是如果没有办法重现,不幸的是很难解决这个问题。 :-(我建议您尝试将代码一分为二。删除一些类/函数/等,看看cppcheck是否仍然报告重复警告。如果项目很大,那么我想第一步是确定你是否可以手动检查 2-3 个文件而不是所有文件时会收到重复警告。如果您使用 --verbose ,Cppcheck 应该打印出检查每个文件时使用的预处理器配置。 您还可以使用--file-filter 限制检查哪些文件。即类似cppcheck --project=foo.sln --file-filter="x*.cpp"

以上是关于使用 Jenkins 在 cppcheck 中重复相同的文件、行和错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 email-ext 插件从 Jenkins 发送 Cppcheck 结果/报告

JenKins结合cppcheck及cpplint进行代码风格及静态代码检测

发布“永久”cppcheck 报告

cppcheck 为宏查找“冗余代码:找到以数字常量开头的语句”

如何在 cppcheck 中抑制库代码的输出?

在sublime中使用cppcheck