我正在尝试使用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)
然后分析器找到该错误,并报告除以零。
我想我太天真了,以为分析仪不会停止
除非它可以证明程序是安全的(?)
答案 0 :(得分:0)
问题似乎是,“ Clang静态分析器是否试图证明程序安全?”
答案是否。
C语静态分析(SA)是static analyzer,而不是verifier。这意味着它将尝试查找错误。当找不到更多错误时,它将停止,而不是在证明该程序正确之后。
我还没有证实这一点,但是很可能是Clang SA的内部抽象状态收敛,然后才探索包含该错误的路径。这意味着它认为它已经探索了循环的所有可能的不同行为,使其处于程序状态近似值的范围内。 undecidability of static program analysis的结果是,任何静态分析都必须进行近似计算,而这些近似分析可能导致其遗漏错误。在这种情况下,显然Clang SA愿意探索循环的四个迭代,而不是五个。
是的。安德烈(Andrey)在评论中说,PVS-Studio找到了它,我没有理由怀疑这一说法。我确信它不是唯一可以使用的工具。
但是要当心:这是双向的。一些工具只是报告更多结果,通常不仅包括更多结果,而且还包含更大比例的误报。
理想的静态分析工具可以找到足够多的真实错误,以证明使用它的成本(加上商业许可的成本),同时报告很少的误报,使人们不会失去信心并停止使用它。这是很难达成的平衡,并且通常会因为缺少一个错误而将工具解雇。