偶尔,开始熟悉PVS-Studio代码分析器的程序员会问我:“是否存在一系列准确指示错误的警告?” 没有这样的列表,因为在一个项目中无趣的(错误)警告在另一个项目中非常重要且有用。 但是,绝对可以从最令人兴奋的警告中开始深入分析仪。 让我们仔细看一下这个主题。
通常,问题首先是运行程序员时,程序员淹没了收到的大量警告。 自然,他想开始回顾最有趣的警告,以了解他是否应该花时间整理所有这些信息。 很好,所以这里有三个简单的步骤,使他可以检查出最令人兴奋的警告。
第一步
禁用除常规警告(GA)以外的所有警告类型。 一个常见的错误是启用所有类型的警告。 没有经验的用户认为启用的越多越好。 事实并非如此。 有一些诊断集,例如64位检查和MISRA规则,仅在清楚地知道它们是什么以及如何使用它们时才应使用。 例如,为普通的应用程序启用MISRA诊断,您将淹没在成千上万的警告中,例如:
- V2506 。 米斯拉 函数的末尾应该有一个出口。
- V2507 。 米斯拉 循环\条件语句的主体应放在花括号中。
- V2523 。 米斯拉 所有无符号类型的整数常量都应带有“ u”或“ U”后缀。
大多数MISRA警告不是指出错误,而是代码味道。 自然,程序员开始提出问题。 您如何在所有这些警告中找到有趣的东西? 他应该看什么数字? 这些是错误的问题。 您只需要禁用MISRA集。 这是为嵌入式设备编写质量代码的标准。 该标准的重点是使代码极其简单易懂。 不要尝试在不合适的地方应用它。
注意事项 是的,MISRA具有旨在识别实际错误的规则。 示例:
V2538-不应使用未初始化变量的值。 但是不要害怕禁用MISRA标准。 您不会失去任何东西。 实际错误仍将在常规诊断(GA)中找到。 例如,
V614诊断将找到未初始化的变量。
第二步
任何静态分析仪在首次运行时都会发出误报,并且需要进行一些配置。 它无能为力,但没有看起来那么可怕。 即使是简单的快速设置,也可以消除大多数误报并开始查看非常相关的报告。 我将不作更多讨论,例如,在本文中,我已经写过很多篇文章:“
以EFL核心库为例,PVS-Studio Analyzer的特征,误报的10-15% ”。
花一点时间禁用明显不相关的警告,并与宏相关的误报作斗争。 一般而言,宏是误报的主要原因,因为在使用效果不佳的宏时,在所有情况下都会出现警告。 要取消宏中的警告,您可以在其声明旁边编写特殊类型的注释。
文档中包含更多注释格式。
是的,初始设置将花费一些时间,但是会消除干扰性,从而极大地改善报告的感知度。 花一些时间来做。 如果有任何困难或问题,我们将随时为您提供帮助,并告诉您如何以最佳方式设置分析仪。 随时
写信和问我们问题。
第三步
从1级开始查看警告。只有在监视2级和3级之后,警告级别不过是警告的准确性。 级别1的警告比级别2的警告更有可能指示实际错误。
您可以说,当您选择“观看级别1”时,您按了“观看最有趣的错误”按钮。
在文章“
静态分析器对抗误报的方式以及为什么这样做的原因 ”一文中,对PVS-Studio警告进行了更详细的分类。
那么为什么没有列表呢?
但是,列出最有用的警告的想法似乎仍然合理。 让我在一个实际示例中向您展示诊断的有用性是相对的,并且取决于项目。
让我们考虑一下
V550警告。 该警告检测到潜在的错误,该错误与以下事实有关:为了将数字与浮点数进行比较,请使用运算符==或!=。
我与之交谈过的大多数开发人员都认为该诊断是无用的,因此他们将其禁用,因为其对项目的所有触发都是错误的。 这就是为什么此诊断的确定性较低且与级别3相关的原因。
实际上,在大多数应用程序中,在非常简单的算法中都使用了float / double类型。 通常,将与常数的比较仅用于检查默认情况下是否设置了某个值,或者该值是否已更改。 在这种情况下,确切的检查是非常合适的。 我将用伪代码解释它。
float value = 1.0f; if (IsUserInputNewValue()) value = GetUserValue(); if (value == 1.0f) DefaultBehavior(); else Foo(value);
这里的比较
(值1.0f)是正确和安全的。
这是否意味着V550诊断程序没有兴趣? 不行 这完全取决于项目。 让我引用用户编写的文章“
我们如何尝试对X射线血管内外科手术训练模拟器项目进行静态分析 ”的摘录。
因此,我们的静态分析仪要注意的是:
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); }
这种类型的错误在此库中经常重复出现。 我不能说这让我感到惊讶。 以前,我在此项目中遇到了对带有浮点数的数字的错误处理。 但是,没有资源可以系统地验证来源。 作为检查的结果,很明显,有必要为开发人员提供一些在使用浮点数方面扩大视野的方法。 他与几篇好文章相关。 我们将看看结果如何。 很难确定该错误是否导致程序真正中断。 当前的解决方案对原始的多边形动脉网提出了许多要求,这些要求模拟了X射线造影剂的扩散。 如果不满足要求,则程序可能会失败,或者工作显然不正确。 这些要求中的一些是通过分析得出的,而某些是凭经验得出的。 正是由于对浮点数的不正确处理,这种经验性的要求增长了。 应该注意的是,并非所有发现的使用浮点数精确比较的案例都是错误的。
如您所见,在某些项目中不感兴趣的是在其他项目中感兴趣的。 这使得不可能创建“最有趣的”列表。
注意事项 您也可以使用设置来设置警告级别。 例如,如果您认为V550诊断程序值得密切关注,则可以将其从3级移到1级。
文档中介绍了这种类型的设置(请参阅“如何为特定诊断设置级别”)。
结论
现在您知道如何通过查看最有趣的警告来开始研究分析仪警告。 并且不要忘记查看文档以获得警告的详细描述。 有时,乍一看,警告是在地狱后面。 此类诊断的示例:
V597 ,
V1026 。 谢谢您的关注。