微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Clang scan-build 无法找到无限循环

如何解决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 报告这种错误,或者是否有另一个我可以使用的开源静态分析器?我很惊讶注释掉第二行并没有给出任何警告,我确定我已经看到了类似错误的警告,在 ij 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 举报,一经查实,本站将立刻删除。