时不时地,开始熟悉PVS-Studio代码分析器的程序员会问:“是否有准确显示错误的警告列表?” 之所以没有这样的列表,是因为一个项目中的无趣(错误)警告非常重要和有用。 但是,很可能会与分析仪开始接触最有趣的警告。 让我们仔细看一下这个主题。
问题在于,在首次启动时,程序员通常会收到大量“淹死”的警告。 自然地,他渴望了解最有趣的警告,以了解他是否应该度过所有这些时间。 太好了,这里有三个简单的步骤,可让您熟悉最有趣的优点。
第一步
禁用除常规(GA)之外的所有类型的警报。 一个常见的错误:启用各种警告。 对于没有经验的用户,打开它的次数似乎越多越好。 事实并非如此! 有许多诊断程序,例如64位检查和MISRA规则,应仅在清楚其含义以及如何使用它们的情况下使用。 例如,为普通的应用程序打开MISRA诊断,您将淹没在成千上万,成千上万的消息中,例如:
- V2506 。 米斯拉 函数的末尾应该有一个出口。
- V2507 。 米斯拉 循环\条件语句的主体应放在花括号中。
- V2523 。 米斯拉 所有无符号类型的整数常量都应带有“ u”或“ U”后缀。
大多数MISRA警告并不表示错误,而是代码气味。 自然地,一个人开始提出问题。 如何在所有这些警告中找到一些有趣的东西? 诊断他应该看哪个数字? 这些是错误的问题。 您只需要禁用MISRA工具包。 这是为嵌入式设备编写质量代码的标准。 标准的本质:使代码极其简单易懂。 不要尝试在不合适的地方应用它。
注意事项 是的,MISRA标准中有一些规则旨在识别实际错误。 示例:
V2538-不应使用未初始化变量的值。 但是不要害怕禁用MISRA标准。 您将不会失去任何东西。 在通用诊断程序(GA)中仍会发现真正的错误。 例如,
借助V614诊断,将找到未初始化的变量。
第二步
任何静态分析仪在首次启动时都会产生误报,并且需要某种配置。 对此无能为力,但并不像看起来那样可怕。 即使是简单的快速设置,也可以消除大多数错误警告,并开始熟悉本来就足够的报告。 我们不会对此进行更详细的讨论,因为例如我在本文中多次写过它:“
使用EFL Core Libraries示例的PVS-Studio分析仪的特征,误报的10-15% 。”
花一点时间禁用明显不相关的警告,并消除由于宏导致的误报。 宏通常是误报的主要来源,因为在使用失败的宏的任何地方都会出现警告。 为了取消宏中的警告,可以在其声明旁边放置一种特殊的注释。
文档中将详细讨论编写评论的格式。
是的,初始设置将花费一些时间,但是通过消除干扰因素可以极大地改善报告的感知度。 为此花一些时间。 如果有任何困难或问题,我们将随时为您提供帮助,并建议如何最佳配置分析仪。 随时
写信和问我们问题。
第三步
从1级开始学习警告。 然后仅查看2和3。警告级别仅是警告的可靠性。 1级警告比2级警告更可能指示真实错误。
我们可以说选择“监视级别1”,然后按“监视最有趣的错误”按钮。
“
静态分析仪如何以及为何处理误报 ”一文中更详细地描述了按级别对PVS-Studio警报进行分类。
那么为什么仍然没有清单?
但是,列出最有用的警告的想法似乎仍然是合理的。 让我通过实际示例说明诊断的有用性是相对的,并且取决于项目。
考虑警告
V550 。 警告显示由于操作符==或!=用于比较浮点数而引起的潜在错误。
与我交谈过的大多数开发人员都相信,这种诊断没什么用,因此将其关闭,因为对他们的项目的所有肯定都是错误的。 这就是为什么此诊断的可靠性较低并且位于第三级的原因。
实际上,在大多数应用程序中,float / double类型用于非常简单的算法中。 通常,将与常数的比较仅用于检查是否设置了默认值,或者是否已更改了默认值。 在这种情况下,准确的检查是非常合适的。 我将用伪代码解释这一点。
float value = 1.0f; if (IsUserInputNewValue()) value = GetUserValue(); if (value == 1.0f) DefaultBehavior(); else Foo(value);
这里的比较
(值== 1.0f)是正确和安全的。
这是否意味着V550是无关紧要的诊断? 不行 这完全取决于项目。 我将引用其中一位用户撰写的文章“
我们如何在血管内外科手术训练模拟器的项目中测试静态分析 ”中的片段。
因此,静态分析仪吸引我们注意的是:
V550一个奇怪的精确比较:t!=0。使用具有定义的精确度的比较可能更好:晶圆厂(A-B)> Epsilon。 objectextractpart.cpp 3401
D3DXVECTOR3 N = VectorMultiplication( VectorMultiplication(V-VP, VN), VN); float t = Qsqrt(Scalar(N, N)); if (t!=0) { N/=t; V = V - N * DistPointToSurface(V, VP, N); }
这个库中经常会重复出现类似的错误。 我不会说这让我感到惊讶。 以前我在此项目中曾遇到过使用浮点数的错误工作。 但是,没有资源可以对此进行系统检查。 根据验证的结果,很明显,您需要给开发人员一些阅读的知识,以拓宽他在使用浮点数方面的视野。 我把他的链接扔给了几篇好文章。 让我们看一下结果。 很难明确地说出此错误是否导致程序真正的故障。 当前的解决方案对初始的动脉多边形网络提出了许多要求,沿着这些要求模拟了不透射线的物质的扩散。 如果不满足要求,则程序可能崩溃,或者明显地是不正确的操作。 这些要求中的一些是通过分析获得的,而某些是凭经验获得的。 需求的第二部分可能只是由于对浮点数的不正确操作而增长。 应该注意的是,并非所有使用浮点数的精确比较的发现案例都是错误的。
如您所见,在某些项目中不感兴趣的是在其他项目中感兴趣的。 这使得不可能创建“最有趣”的列表。
注意事项 可以使用设置来设置警告级别。 例如,如果您认为应该密切关注V550诊断,则可以将其从第三级移到第一级。
文档中介绍了这种类型的设置(请参阅“如何设置特定诊断的级别”)。
结论
现在,您已经知道了如何研究分析仪警告,并考虑了其中最有趣的警告。 并且不要忘记查看文档以熟悉警告的详细说明。 有时,乍一看,毫无预言的警告是地狱。 此类诊断的示例:
V597 ,
V1026 。 谢谢您的关注。

如果您想与说英语的读者分享这篇文章,请使用以下链接:Andrey Karpov。
如何快速检查PVS-Studio分析仪针对C和C ++代码给出的有趣警告?