对静态代码分析器的意见感到遗憾

静态代码分析工具取得了长足的进步。这些根本不是20年前积极使用的“垫子”。但是,许多人仍然将它们称为非常简单的工具。这是一个耻辱。对于一般的代码分析方法和PVS-Studio工具都是可耻的。







悲伤的原因是对我们其中一篇文章的评论。在本文中,分析人员通过向以下代码发出警告来检测输入错误:



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”是总是如此。



程序员不必担心。现代工具是先进的,仅对真正可疑的代码发出警告。有误报,但通常,它们与混乱代码的存在相关联,即使对于一个人来说,这也可能很难理解。





其他连结







如果您想与说英语的读者分享这篇文章,请使用翻译链接:Andrey Karpov。关于静态分析仪的批评意见



All Articles