如何使用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?