在检查各种打开的项目的过程中研究PVS-Studio分析仪的警告,我们一次又一次地确定该工具的实用性。 代码分析器非常细心,从不疲倦。 它表示即使仔细检查代码,错误仍会消失。 考虑另一种这样的情况。
我上一次写
类似的笔记 ,研究了StarEngine:2D Game Engine项目的源代码。 现在,在Qt框架验证期间,分析器已显示出对我而言的优越性。
上一次我们在2014年
测试 Qt框架。 很多时间过去了,项目发生了变化,PVS-Studio分析仪中出现了许多新的诊断信息。 因此,很可能写出我写的另一篇文章。
在编写有趣的错误示例时,我遇到了以下代码:
QWindowsCursor::CursorState QWindowsCursor::cursorState() { enum { cursorShowing = 0x1, cursorSuppressed = 0x2 }; CURSORINFO cursorInfo; cursorInfo.cbSize = sizeof(CURSORINFO); if (GetCursorInfo(&cursorInfo)) { if (cursorInfo.flags & CursorShowing)
PVS-Studio发出此代码警告:
V616 CWE-480在按位运算中使用名为“ CursorShowing”的常量,其值为0。 qwindowscursor.cpp 669
使用不稳定版本的PVS-Studio进行验证,因此我对分析仪的信念摇摇欲坠。 我叹了口气:“哦,我们在处理未命名转账的机制上遇到了麻烦。”然后将此案写给bugtracker,作为导致误报的错误。
我绝对确定分析仪是错误的。 毕竟,在上面仅几行的地方,
CursorShowing常数是1。
同时,我尝试要小心! 我浏览了几次代码,以确保分析仪是错误的。 我将这段代码和相应的消息设计为Bugtracker中的错误。
我对这小段代码进行了彻底的审查,但还是搞砸了。 分析仪是正确的,不是人。
在对这种情况的详细研究中,事实证明,
上面已
声明了名为
cursorShowing常量,并且在该条件下使用了
CursorShowing常量。 区别仅在于首字母! 一处是小写字母,另一处是大写字母。
为什么要编译代码? 因为
CursorShowing常量也存在。 这是她的公告:
class QWindowsCursor : public QPlatformCursor { public: enum CursorState { CursorShowing, CursorHidden, CursorSuppressed }; .... }
如您所见,
CursorShowing常数为0。因此,PVS-Studio分析器绝对正确地说条件
(cursorInfo.flags和CursorShowing)没有意义。 条件始终为假。
分析仪发现了一个错字。 爱静态代码分析! :)

如果您想与说英语的读者分享这篇文章,请使用以下链接:Andrey Karpov。
事实证明,PVS-Studio分析仪比人更细心 。