29
29
* Represents a class in coverage engine.
30
30
*/
31
31
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
+
32
37
private final String myClassName ;
33
38
private LineData [] myLinesArray ;
34
39
private Map <String , Integer > myStatus ;
@@ -271,15 +276,27 @@ public void setTraceMask(boolean[] traceMask) {
271
276
myTraceMask = traceMask ;
272
277
}
273
278
279
+ public static int trimHits (int hits ) {
280
+ if (0 <= hits && hits <= MAX_HITS ) return hits ;
281
+ return MAX_HITS ;
282
+ }
283
+
274
284
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
+ }
276
293
try {
277
294
for (LineData lineData : myLinesArray ) {
278
295
if (lineData == null ) continue ;
279
296
int lineId = lineData .getId ();
280
297
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 ;
283
300
}
284
301
285
302
JumpData [] jumps = lineData .getJumps ();
@@ -288,13 +305,13 @@ public void applyHits() {
288
305
if (jumpData == null ) continue ;
289
306
int trueId = jumpData .getId (true );
290
307
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 ;
293
310
}
294
311
int falseId = jumpData .getId (false );
295
312
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 ;
298
315
}
299
316
}
300
317
}
@@ -305,17 +322,17 @@ public void applyHits() {
305
322
if (switchData == null ) continue ;
306
323
int defaultId = switchData .getId (-1 );
307
324
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 ;
310
327
}
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 ++) {
313
330
int caseId = switchData .getId (i );
314
331
if (caseId == -1 ) continue ;
315
- hits [i ] += myHitsMask [caseId ];
316
- myHitsMask [caseId ] = 0 ;
332
+ switchHits [i ] += hits [caseId ];
333
+ hits [caseId ] = 0 ;
317
334
}
318
- switchData .setKeysAndHits (switchData .getKeys (), hits );
335
+ switchData .setKeysAndHits (switchData .getKeys (), switchHits );
319
336
}
320
337
}
321
338
}
0 commit comments