如何使用Eclipse在Java代码中查找潜在的数字溢出?
有没有办法使用Eclipse IDE在Java代码中查找潜在的数字溢出? 例如...
long aLong = X * Y * Z;
...其中X,Y和Z是整数,结果可能会溢出Integer.MAX_VALUE。 (请注意,如果本例中的结果溢出Integer.MAX_VALUE,aLong将被分配错误的溢出值)。
我查看了Eclipse的警告设置,PMD规则和FindBugs规则,我找不到任何设置来帮助解决这个问题。 一位同事指出,IntelliJ会警告这个......我不想承认我不能在Eclipse上做同样的事情。 ;-)
澄清1:我不是在寻找0误报的东西......只是警告“你可能在这里有溢出问题”。
澄清2:这是“开发时间”所需要的......意思是说,在Eclipse正在寻找未使用的进口的同一阶段,PMD正在检查其规则等。
如果你不知道X会是什么,那可能是最糟糕的情况。 那么,最坏的情况是什么:
int X = Integer.MAX_VALUE;
long aLong = X + 1;
结论:你不想让Eclipse警告你所有的事情。
如果你想修复整数溢出的话
long aLong = X * Y * Z; //you could write
long aLong = (long)X * Y * Z;
结论:这不会解决长期溢出问题。 如果你想修复它们,你应该编写如下代码:
BigInteger tmp = BigInteger.valueOf(X).multiply(BigInteger.valueOf(Y)).multiply(BigInteger.valueOf(Z));
if(BigInteger.valueOf(Long.MAX_VALUE).compareTo(tmp)>=0){
long aLong = tmp.longValue();
}else{
System.out.println("Overflow");
}
但是这只会检查结果值是否适合很长时间。 但是你问,如果在计算过程中发生“溢出”。 这意味着在每次计算之后,您需要检查这一点。
如果你想编写一个eclipse工具来解析整个源文件来找到它,那么我不会阻止你。 但是,记住下面的值会更简单:
/*11111111111111111111111111111111*/int Y = -1; //-1
/*11111111111111111111111111111111*/int QRY = (Y >> 1); //-1
/*11111111111111111111111111111110*/int QLY = (Y << 1); //-2
/*11111111111111111111111111111110*/int QLX = (X << 1); //-2
/*11000000000000000000000000000000*/int QRZ = (Z >> 1); //-1073741824
/*10000000000000000000000000000000*/int Z = Integer.MIN_VALUE; //-2147483648
/*01111111111111111111111111111111*/int X = Integer.MAX_VALUE; // 2147483647
/*00111111111111111111111111111111*/int QRX = (X >> 1); // 1073741823
/*00000000000000000000000000000000*/int QLZ = (Z << 1); // 0
在FindBugs中,FindPuzzlers检测器的描述包含
ICAST_INTEGER_MULTIPLY_CAST_TO_LONG(ICAST,STYLE):将整数乘法的结果转换为long
但不知何故,我不能在下面的代码中检测到这个问题:
final int x = 10000;
final int y = 10000;
final int z = 10000;
final long aLong = x * y * z;
System.out.println(aLong);
你想在编译时? 还没有看到一个设置来做到这一点。
如果你真的想要它,最好的选择是最有可能为PMD写一个新的规则集?
链接地址: http://www.djcxy.com/p/43303.html上一篇: How to find potential numeric overflows in Java code, using Eclipse?
下一篇: UIImagePickerController has a black bar at the bottom by default?