From b877bc7f4a4107df00a7d603333d0096309d7565 Mon Sep 17 00:00:00 2001 From: Evgeny Mandrikov Date: Mon, 7 May 2012 15:36:22 +0600 Subject: [PATCH] SONAR-3442 Fix possible ArrayIndexOutOfBoundsException --- .../timemachine/ViolationTrackingBlocksRecognizer.java | 8 ++++++++ .../core/timemachine/ViolationTrackingDecorator.java | 4 ++-- .../timemachine/tracking/HashedSequenceComparator.java | 5 ++++- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/ViolationTrackingBlocksRecognizer.java b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/ViolationTrackingBlocksRecognizer.java index ea4c1eee51f..c5a2666ae3a 100644 --- a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/ViolationTrackingBlocksRecognizer.java +++ b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/ViolationTrackingBlocksRecognizer.java @@ -40,6 +40,14 @@ public class ViolationTrackingBlocksRecognizer { this.cmp = new HashedSequenceComparator(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) diff --git a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/ViolationTrackingDecorator.java b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/ViolationTrackingDecorator.java index ee92393da35..fee56b16787 100644 --- a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/ViolationTrackingDecorator.java +++ b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/ViolationTrackingDecorator.java @@ -124,9 +124,9 @@ public class ViolationTrackingDecorator implements Decorator { List 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)); } diff --git a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/tracking/HashedSequenceComparator.java b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/tracking/HashedSequenceComparator.java index 0c312e1d147..5d82a5fa34d 100644 --- a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/tracking/HashedSequenceComparator.java +++ b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/tracking/HashedSequenceComparator.java @@ -31,7 +31,10 @@ public class HashedSequenceComparator implements SequenceCom } public boolean equals(HashedSequence a, int ai, HashedSequence 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 seq, int i) { -- 2.39.5