【发布时间】:2020-06-08 05:04:23
【问题描述】:
如果我传入值为 0 的除数,我将遵循具有潜在无限循环的 Java 代码。但是 Coverity 不能为我报告这个错误。
class InfinityLoopExample {
public int div(final int dividend, final int divisor) {
int ret = 0;
int x = dividend;
while (x > divisor) {
x = x - divisor;
ret++;
}
return ret;
}
}
//And following code to actually call that method i.e. in main.
//This will make sure infinite loop real happens
final InfinityLoopExample infinityLoopExample = new InfinityLoopExample();
final int ret1 = infinityLoopExample.div(3,0);
System.out.println("infinityLoopExample.div:" + ret1);
从以下coverity 链接可以清楚地看出,coverity 可以在其静态代码分析期间报告此类错误: https://cwe.mitre.org/data/definitions/835.html
我对上面的 Java 代码运行了覆盖代码扫描,它不能报告无限循环问题。有没有人对 Java 项目进行过覆盖代码扫描可以提供一些启示?
P.S 我有大小为 151K 的覆盖构建日志文件。如果需要,我可以发布。
【问题讨论】:
-
我对覆盖率知之甚少,但我可以说这是因为您的 while 循环对于每个输入都不会无穷大。它适用于特定案例。
-
@jnrdn0011 我同意。我实际上有代码来调用该方法以确保发生无限循环。我只是将这部分包含在我的问题中以使其更清楚。谢谢!
-
这些都是陈述。问题是什么?
-
@erickson Coverity 假设可以在 Java 代码中找到这种错误,但它不能。
-
那是另一种说法。您是否要求确认 Coverity 应该对此代码发出警报?像一些文档的链接?您是在询问警告应该在循环中还是在呼叫站点上?您是在问是否有一些配置抑制了这个(有点可疑)的发现?请清楚您的要求。