lang静态分析器未除以零

时间:2018-12-02 11:19:38

标签: clang-static-analyzer

我正在尝试使用clang静态分析器,发现 下面的示例未将零除以零:

#include <stdio.h>

int k = 300;

char *parse_mailpath_spec (char *str)
{
    char *s;
    int pass_next;

    for (s = str, pass_next = 0; s && *s; s++)
    {
        if (pass_next == 4)
        {
            int j = 0;
            k = 5 / j;
        }
        if (*s == '\\')
        {
            pass_next++;
            continue;
        }
        if (*s == '?' || *s == '%')
        {
            return s;
        }
    }
    return ((char *)NULL);
}

int main(int argc, char **argv)
{
    if (parse_mailpath_spec(argv[1])) return 0;
    else return -1;
}

如果我将if (pass_next == 4)更改为if (pass_next == 3) 然后分析器找到该错误,并报告除以零。 我想我太天真了,以为分析仪不会停止 除非它可以证明程序是安全的(?)

1 个答案:

答案 0 :(得分:0)

问题似乎是,“ Clang静态分析器是否试图证明程序安全?”

答案是

为什么不呢?

C语静态分析(SA)是static analyzer,而不是verifier。这意味着它将尝试查找错误。当找不到更多错误时,它将停止,而不是在证明该程序正确之后。

为什么会错过这个错误?

我还没有证实这一点,但是很可能是Clang SA的内部抽象状态收敛,然后才探索包含该错误的路径。这意味着它认为它已经探索了循环的所有可能的不同行为,使其处于程序状态近似值的范围内。 undecidability of static program analysis的结果是,任何静态分析都必须进行近似计算,而这些近似分析可能导致其遗漏错误。在这种情况下,显然Clang SA愿意探索循环的四个迭代,而不是五个。

其他工具可以找到它吗?

是的。安德烈(Andrey)在评论中说,PVS-Studio找到了它,我没有理由怀疑这一说法。我确信它不是唯一可以使用的工具。

但是要当心:这是双向的。一些工具只是报告更多结果,通常不仅包括更多结果,而且还包含更大比例的误报。

理想的静态分析工具可以找到足够多的真实错误,以证明使用它的成本(加上商业许可的成本),同时报告很少的误报,使人们不会失去信心并停止使用它。这是很难达成的平衡,并且通常会因为缺少一个错误而将工具解雇。