如何解决Clang scan-build 无法找到无限循环
do{
ys = (ys*ys + 1)%n;
d = egcd(x > y ? x - y : y - x,n,NULL,NULL);
}while(d == 1);
这个循环是使用 gcd 聚合的 Pollard-Rho-Brent 分解算法的一部分。这保证了它会在它出现在更大的程序中的地方终止。然而,y
而不是 ys
的小错误意味着循环永远不会终止,因为 ys
中的更改永远不会反映在 d
中。但是,scan-build
无法识别此问题。最初我认为这是因为它不知道 egcd
是一个纯函数。 (egcd
返回前两个参数的 gcd,如果后两个参数为非空,则将 Bezout 系数输出到后两个参数。)但是,即使我注释掉循环的那一行,d
也不会被修改, scan-build
无法报告无限循环。有没有办法让 scan-build
报告这种错误,或者是否有另一个我可以使用的开源静态分析器?我很惊讶注释掉第二行并没有给出任何警告,我确定我已经看到了类似错误的警告,在 i
和 j
where {{1} 上嵌套 for 循环}} 在两者中都增加,但检查仍然正确。
编辑:i
是什么并不重要。定义是
egcd
但它可能只是 int64_t egcd(int64_t a,int64_t b,int64_t *_t,int64_t *_s){
int64_t r0 = b,r1 = a;
int64_t s0 = 1,s1 = 0;
int64_t t0 = 0,t1 = 1;
while(r1){
int64_t q = r0/r1,t;
t = r1;
r1 = r0 - q*r1;
r0 = t;
t = s1;
s1 = s0 - q*s1;
s0 = t;
t = t1;
t1 = t0 - q*t1;
t0 = t;
}
if(_t){
*_t = t0;
}
if(_s){
*_s = s0;
}
return r0;
}
甚至 #define egcd(a,b,t,s) (a)==(b)?a:1
或者使用它的行可以被注释掉,并且 clang 静态分析器仍然不会将其识别为无限循环。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。