]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-3442 Fix possible ArrayIndexOutOfBoundsException
authorEvgeny Mandrikov <mandrikov@gmail.com>
Mon, 7 May 2012 09:36:22 +0000 (15:36 +0600)
committerEvgeny Mandrikov <mandrikov@gmail.com>
Mon, 7 May 2012 09:36:22 +0000 (15:36 +0600)
plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/ViolationTrackingBlocksRecognizer.java
plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/ViolationTrackingDecorator.java
plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/tracking/HashedSequenceComparator.java

index ea4c1eee51fbe8a34770a0a8009059cc5d526826..c5a2666ae3aa705fb4b95bbea9ba80d4b6dfb24a 100644 (file)
@@ -40,6 +40,14 @@ public class ViolationTrackingBlocksRecognizer {
     this.cmp = new HashedSequenceComparator<StringText>(cmp);
   }
 
+  public boolean isValidLineInReference(int line) {
+    return (0 <= line) && (line < a.length());
+  }
+
+  public boolean isValidLineInSource(int line) {
+    return (0 <= line) && (line < b.length());
+  }
+
   /**
    * @param startA number of line from first version of text (numbering starts from 0)
    * @param startB number of line from second version of text (numbering starts from 0)
index ee92393da35b0ccf3f05ca6c170b5d1bda16bd2d..fee56b167875b65c1d43b100d3625b42329f0f6e 100644 (file)
@@ -124,9 +124,9 @@ public class ViolationTrackingDecorator implements Decorator {
 
           List<ViolationPair> possiblePairs = Lists.newArrayList();
           for (Violation newViolation : newViolations) {
-            if (newViolation.getLineId() != null) {
+            if (newViolation.getLineId() != null && rec.isValidLineInSource(newViolation.getLineId() - 1)) {
               for (RuleFailureModel pastViolation : pastViolationsByRule.get(newViolation.getRule().getId())) {
-                if (pastViolation.getLine() != null) {
+                if (pastViolation.getLine() != null && rec.isValidLineInReference(pastViolation.getLine() - 1)) {
                   int weight = rec.computeLengthOfMaximalBlock(pastViolation.getLine() - 1, newViolation.getLineId() - 1);
                   possiblePairs.add(new ViolationPair(pastViolation, newViolation, weight));
                 }
index 0c312e1d147eed7834984d9d3aa85ea4d66be108..5d82a5fa34d6187d3cd87656933afd8133764883 100644 (file)
@@ -31,7 +31,10 @@ public class HashedSequenceComparator<S extends Sequence> implements SequenceCom
   }
 
   public boolean equals(HashedSequence<S> a, int ai, HashedSequence<S> b, int bi) {
-    return a.hashes[ai] == b.hashes[bi] && cmp.equals(a.base, ai, b.base, bi);
+    if (a.hashes[ai] == b.hashes[bi]) {
+      return cmp.equals(a.base, ai, b.base, bi);
+    }
+    return false;
   }
 
   public int hash(HashedSequence<S> seq, int i) {