aboutsummaryrefslogtreecommitdiff
path: root/agent/src/test/java/com/code_intelligence/jazzer
diff options
context:
space:
mode:
authorFabian Meumertzheim <meumertzheim@code-intelligence.com>2021-02-22 08:12:56 +0100
committerFabian Meumertzheim <fabian@meumertzhe.im>2021-02-22 14:33:55 +0100
commit4fb408bdcbfb32b207c0b92cc98bc3e95c9f7665 (patch)
treefeb9831b957c20c6d39b9e6a45202bd0b9a01106 /agent/src/test/java/com/code_intelligence/jazzer
parent615d76fdaf6f0f055b2d7970c7f4a3ea126885a6 (diff)
downloadjazzer-api-4fb408bdcbfb32b207c0b92cc98bc3e95c9f7665.tar.gz
Use NeverZero instead of Saturated Counters for coverage
According to https://www.usenix.org/system/files/woot20-paper-fioraldi.pdf, letting coverage 8-bit counters wrap from 255 to 1 on increment performs better than having them stay at 255. In fact, the latter has been observed to hurt overall coverage.
Diffstat (limited to 'agent/src/test/java/com/code_intelligence/jazzer')
-rw-r--r--agent/src/test/java/com/code_intelligence/jazzer/instrumentor/CoverageInstrumentationTest.kt9
1 files changed, 6 insertions, 3 deletions
diff --git a/agent/src/test/java/com/code_intelligence/jazzer/instrumentor/CoverageInstrumentationTest.kt b/agent/src/test/java/com/code_intelligence/jazzer/instrumentor/CoverageInstrumentationTest.kt
index 31f40575..e52231cd 100644
--- a/agent/src/test/java/com/code_intelligence/jazzer/instrumentor/CoverageInstrumentationTest.kt
+++ b/agent/src/test/java/com/code_intelligence/jazzer/instrumentor/CoverageInstrumentationTest.kt
@@ -109,11 +109,14 @@ class CoverageInstrumentationTest {
// Control flows through the first if branch once per run.
val takenOnEveryRunEdge = ifFirstBranch
- for (i in 1..300) {
+ var lastCounter = 0.toUByte()
+ for (i in 1..600) {
assertSelfCheck(target)
assertEquals(1, MockCoverageMap.mem[takenOnceEdge])
- // Verify that the counter does not overflow.
- val expectedCounter = i.coerceAtMost(255).toUByte()
+ // Verify that the counter increments, but is never zero.
+ val expectedCounter = (lastCounter + 1U).toUByte().takeUnless { it == 0.toUByte() }
+ ?: (lastCounter + 2U).toUByte()
+ lastCounter = expectedCounter
val actualCounter = MockCoverageMap.mem[takenOnEveryRunEdge].toUByte()
assertEquals(expectedCounter, actualCounter, "After $i runs:")
}