diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/optimizations/RedundantFieldInitializerRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/optimizations/RedundantFieldInitializerRule.java index af9d114d53..c8da3517b1 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/optimizations/RedundantFieldInitializerRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/optimizations/RedundantFieldInitializerRule.java @@ -3,6 +3,8 @@ */ package net.sourceforge.pmd.lang.java.rule.optimizations; +import java.math.BigInteger; + import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.java.ast.ASTBooleanLiteral; import net.sourceforge.pmd.lang.java.ast.ASTCastExpression; @@ -74,26 +76,26 @@ public class RedundantFieldInitializerRule extends AbstractJavaRule { } else if (literal.jjtGetNumChildren() == 0) { // numeric type // Note: Not catching NumberFormatException, as it shouldn't be happening on valid source code. - double value = -1; + Number value = -1; if (literal.isIntLiteral()) { - value = Integer.decode(literal.getImage()).doubleValue(); + value = parseInteger(literal.getImage()); } else if (literal.isLongLiteral()) { String s = literal.getImage(); // remove the ending "l" or "L" for long values s = s.substring(0, s.length() - 1); - value = Long.decode(s).doubleValue(); + value = parseInteger(s); } else if (literal.isFloatLiteral()) { String s = literal.getImage(); // remove the ending "f" or "F" for float values s = s.substring(0, s.length() - 1); - value = Float.parseFloat(literal.getImage()); + value = Float.valueOf(s); } else if (literal.isDoubleLiteral()) { - value = Double.parseDouble(literal.getImage()); + value = Double.valueOf(literal.getImage()); } else if (literal.isCharLiteral()) { - value = literal.getImage().charAt(1); + value = (int) literal.getImage().charAt(1); } - if (value == 0) { + if (value.intValue() == 0) { addViolation(data, variableDeclarator); } } @@ -129,4 +131,25 @@ public class RedundantFieldInitializerRule extends AbstractJavaRule { private void addViolation(Object data, ASTVariableDeclarator variableDeclarator) { super.addViolation(data, variableDeclarator, variableDeclarator.jjtGetChild(0).getImage()); } + + private Number parseInteger(String s) { + boolean negative = false; + String number = s; + if (number.charAt(0) == '-') { + negative = true; + number = number.substring(1); + } + BigInteger result; + if (number.startsWith("0x") || number.startsWith("0X")) { + result = new BigInteger(number.substring(2), 16); + } else if (s.startsWith("0") && s.length() > 1) { + result = new BigInteger(number.substring(1), 8); + } else { + result = new BigInteger(number); + } + if (negative) { + result = result.negate(); + } + return result; + } } \ No newline at end of file diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/optimizations/xml/RedundantFieldInitializer.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/optimizations/xml/RedundantFieldInitializer.xml index 1e03f0a095..0d824599a7 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/optimizations/xml/RedundantFieldInitializer.xml +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/optimizations/xml/RedundantFieldInitializer.xml @@ -1258,4 +1258,14 @@ public class Foo { } ]]> + + + #1298 Member variable int type with value 0xff000000 causes processing error + 0 + +public class LinePoint { + private int mColor = 0xFF000000; +} + + diff --git a/src/site/markdown/overview/changelog.md b/src/site/markdown/overview/changelog.md index ecc02bb170..b538600251 100644 --- a/src/site/markdown/overview/changelog.md +++ b/src/site/markdown/overview/changelog.md @@ -9,3 +9,5 @@ **Pull Requests:** **Bugfixes:** + +* [#1298](https://sourceforge.net/p/pmd/bugs/1298/): Member variable int type with value 0xff000000 causes processing error