Skip to content

Commit c29c0d9

Browse files
committed
Prevent hits overflow
1 parent 87cbfcb commit c29c0d9

File tree

4 files changed

+43
-23
lines changed

4 files changed

+43
-23
lines changed

src/com/intellij/rt/coverage/data/ClassData.java

+31-14
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@
2929
* Represents a class in coverage engine.
3030
*/
3131
public class ClassData implements CoverageData {
32+
/**
33+
* Hits value forced to be in [0, MAX_HITS] to prevent hits overflow.
34+
*/
35+
private static final int MAX_HITS = 1000000000;
36+
3237
private final String myClassName;
3338
private LineData[] myLinesArray;
3439
private Map<String, Integer> myStatus;
@@ -271,15 +276,27 @@ public void setTraceMask(boolean[] traceMask) {
271276
myTraceMask = traceMask;
272277
}
273278

279+
public static int trimHits(int hits) {
280+
if (0 <= hits && hits <= MAX_HITS) return hits;
281+
return MAX_HITS;
282+
}
283+
274284
public void applyHits() {
275-
if (myHitsMask == null) return;
285+
final int[] hits = myHitsMask;
286+
if (hits == null) return;
287+
288+
for (int i = 0; i < hits.length; ++i) {
289+
if (hits[i] < 0 || hits[i] > MAX_HITS) {
290+
hits[i] = MAX_HITS;
291+
}
292+
}
276293
try {
277294
for (LineData lineData : myLinesArray) {
278295
if (lineData == null) continue;
279296
int lineId = lineData.getId();
280297
if (lineId != -1) {
281-
lineData.setHits(lineData.getHits() + myHitsMask[lineId]);
282-
myHitsMask[lineId] = 0;
298+
lineData.setHits(lineData.getHits() + hits[lineId]);
299+
hits[lineId] = 0;
283300
}
284301

285302
JumpData[] jumps = lineData.getJumps();
@@ -288,13 +305,13 @@ public void applyHits() {
288305
if (jumpData == null) continue;
289306
int trueId = jumpData.getId(true);
290307
if (trueId != -1) {
291-
jumpData.setTrueHits(jumpData.getTrueHits() + myHitsMask[trueId]);
292-
myHitsMask[trueId] = 0;
308+
jumpData.setTrueHits(jumpData.getTrueHits() + hits[trueId]);
309+
hits[trueId] = 0;
293310
}
294311
int falseId = jumpData.getId(false);
295312
if (falseId != -1) {
296-
jumpData.setFalseHits(jumpData.getFalseHits() + myHitsMask[falseId]);
297-
myHitsMask[falseId] = 0;
313+
jumpData.setFalseHits(jumpData.getFalseHits() + hits[falseId]);
314+
hits[falseId] = 0;
298315
}
299316
}
300317
}
@@ -305,17 +322,17 @@ public void applyHits() {
305322
if (switchData == null) continue;
306323
int defaultId = switchData.getId(-1);
307324
if (defaultId != -1) {
308-
switchData.setDefaultHits(switchData.getDefaultHits() + myHitsMask[defaultId]);
309-
myHitsMask[defaultId] = 0;
325+
switchData.setDefaultHits(switchData.getDefaultHits() + hits[defaultId]);
326+
hits[defaultId] = 0;
310327
}
311-
int[] hits = switchData.getHits();
312-
for (int i = 0; i < hits.length; i++) {
328+
int[] switchHits = switchData.getHits();
329+
for (int i = 0; i < switchHits.length; i++) {
313330
int caseId = switchData.getId(i);
314331
if (caseId == -1) continue;
315-
hits[i] += myHitsMask[caseId];
316-
myHitsMask[caseId] = 0;
332+
switchHits[i] += hits[caseId];
333+
hits[caseId] = 0;
317334
}
318-
switchData.setKeysAndHits(switchData.getKeys(), hits);
335+
switchData.setKeysAndHits(switchData.getKeys(), switchHits);
319336
}
320337
}
321338
}

src/com/intellij/rt/coverage/data/JumpData.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -51,16 +51,16 @@ public void save(final DataOutputStream os) throws IOException {
5151

5252
public void merge(final CoverageData data) {
5353
final JumpData jumpData = (JumpData) data;
54-
myTrueHits += jumpData.myTrueHits;
55-
myFalseHits += jumpData.myFalseHits;
54+
setTrueHits(myTrueHits + jumpData.myTrueHits);
55+
setFalseHits(myFalseHits + jumpData.myFalseHits);
5656
}
5757

5858
public void setTrueHits(final int trueHits) {
59-
myTrueHits = trueHits;
59+
myTrueHits = ClassData.trimHits(trueHits);
6060
}
6161

6262
public void setFalseHits(final int falseHits) {
63-
myFalseHits = falseHits;
63+
myFalseHits = ClassData.trimHits(falseHits);
6464
}
6565

6666
public int getId(boolean type) {

src/com/intellij/rt/coverage/data/LineData.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ public void save(final DataOutputStream os) throws IOException {
113113

114114
public void merge(final CoverageData data) {
115115
LineData lineData = (LineData) data;
116-
myHits += lineData.myHits;
116+
setHits(myHits + lineData.getHits());
117117
if (myJumpsAndSwitches != null || lineData.myJumpsAndSwitches != null) {
118118
getOrCreateJumpsAndSwitches().merge(lineData.getOrCreateJumpsAndSwitches());
119119
}
@@ -228,7 +228,7 @@ public BranchData getBranchData() {
228228
}
229229

230230
public void setHits(final int hits) {
231-
myHits = hits;
231+
myHits = ClassData.trimHits(hits);
232232
}
233233

234234
public void setTestName(String testName) {

src/com/intellij/rt/coverage/data/SwitchData.java

+6-3
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,9 @@ public void save(final DataOutputStream os) throws IOException {
6464

6565
public void merge(final CoverageData data) {
6666
SwitchData switchData = (SwitchData) data;
67-
myDefaultHits += switchData.myDefaultHits;
67+
setDefaultHits(myDefaultHits + switchData.myDefaultHits);
6868
for (int i = Math.min(myHits.length, switchData.myHits.length) - 1; i >= 0; i--) {
69-
myHits[i] += switchData.myHits[i];
69+
myHits[i] = ClassData.trimHits(myHits[i] + switchData.myHits[i]);
7070
}
7171
if (switchData.myHits.length > myHits.length) {
7272
int[] old = myHits;
@@ -78,12 +78,15 @@ public void merge(final CoverageData data) {
7878
}
7979

8080
public void setDefaultHits(final int defaultHits) {
81-
myDefaultHits = defaultHits;
81+
myDefaultHits = ClassData.trimHits(defaultHits);
8282
}
8383

8484
public void setKeysAndHits(final int[] keys, final int[] hits) {
8585
myKeys = keys;
8686
myHits = hits;
87+
for (int i = 0; i < myHits.length; i++) {
88+
myHits[i] = ClassData.trimHits(myHits[i]);
89+
}
8790
}
8891

8992
public int[] getKeys() {

0 commit comments

Comments
 (0)