悲伤的原因是对我们其中一篇文章的评论。在本文中,分析人员通过向以下代码发出警告来检测输入错误:
if (A[0] == 0)
{
X = Y;
if (A[0] == 0)
....
}
分析仪说第二个条件始终为真。的确,如果您检查函数的主体,很显然应该检查数组的另一个元素。
对此,大约收到了以下评论:
是的,分析仪确实在此处指示错误。但是通常,此警告是不正确的。毕竟,在两次相同的检查之间,元素的值可以更改,然后第二次检查才有意义。我伤心。程序员仍然认为代码分析器是建立在正则表达式上的。据说发现两个相同的嵌套if和swear。
自然,任何现代静态分析器都会跟踪变量值的变化。如果变量未更改,将出现一条消息。如果更改,将没有消息。为此,使用了数据流分析技术。
这正是PVS-Studio静态分析仪的工作。让我们看下面的综合示例:
char get();
int foo(char *p, bool arg)
{
if (p[1] == 1)
{
if (arg)
p[0] = get();
if (p[1] == 1) // Warning
return 1;
}
if (p[2] == 2)
{
if (arg)
p[2] = get();
if (p[2] == 2) // Ok
return 2;
}
return 3;
}
该代码包含两个类似的块。第一种,被检查的变量不变,第二种,它改变。因此,分析器问题仅对于第一块的警告:V547表达式“P [1] == 1”是总是如此。
程序员不必担心。现代工具是先进的,仅对真正可疑的代码发出警告。有误报,但通常,它们与混乱代码的存在相关联,即使对于一个人来说,这也可能很难理解。
其他连结
- V547诊断程序检测到的错误示例。
- 静态解析和正则表达式(为什么不是个好主意:)。
- PVS-Studio代码分析器中用于查找错误和潜在漏洞的技术。
如果您想与说英语的读者分享这篇文章,请使用翻译链接:Andrey Karpov。关于静态分析仪的批评意见。