From 20c73a1e10a9616a14f4793ead007b2f49ec5558 Mon Sep 17 00:00:00 2001 From: Kostiantyn Melnik Date: Fri, 14 Apr 2023 17:48:01 +0300 Subject: [PATCH 1/3] Patch: update instrumentation order to fix coverage --- .../jazzer/agent/RuntimeInstrumentor.kt | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/code_intelligence/jazzer/agent/RuntimeInstrumentor.kt b/src/main/java/com/code_intelligence/jazzer/agent/RuntimeInstrumentor.kt index f83cf00d7..a1da6bb48 100644 --- a/src/main/java/com/code_intelligence/jazzer/agent/RuntimeInstrumentor.kt +++ b/src/main/java/com/code_intelligence/jazzer/agent/RuntimeInstrumentor.kt @@ -214,12 +214,9 @@ class RuntimeInstrumentor( } return ClassInstrumentor(internalClassName, bytecode).run { if (fullInstrumentation) { - // Hook instrumentation must be performed after data flow tracing as the injected - // bytecode would trigger the GEP callbacks for byte[]. Coverage instrumentation - // must be performed after hook instrumentation as the injected bytecode would - // trigger the GEP callbacks for ByteBuffer. - traceDataFlow(instrumentationTypes) - hooks(includedHooks + customHooks, classWithHooksEnabledField) + // Coverage instrumentation must be performed before any other code updates + // or there will be additional coverage points injected if there are any call is inserted + // and JaCoCo will produce a broken coverage report. coverageIdSynchronizer.withIdForClass(internalClassName) { firstId -> coverage(firstId).also { actualNumEdgeIds -> CoverageRecorder.recordInstrumentedClass( @@ -230,6 +227,10 @@ class RuntimeInstrumentor( ) } } + // Hook instrumentation must be performed after data flow tracing as the injected + // bytecode would trigger the GEP callbacks for byte[]. + traceDataFlow(instrumentationTypes) + hooks(includedHooks + customHooks, classWithHooksEnabledField) } else { hooks(customHooks, classWithHooksEnabledField) } From cb8799c77e6eba69fbb353a33355ebb4e97bd3b9 Mon Sep 17 00:00:00 2001 From: Kostiantyn Melnik Date: Fri, 14 Apr 2023 21:08:42 +0300 Subject: [PATCH 2/3] Update src/main/java/com/code_intelligence/jazzer/agent/RuntimeInstrumentor.kt Co-authored-by: Fabian Meumertzheim --- .../com/code_intelligence/jazzer/agent/RuntimeInstrumentor.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/code_intelligence/jazzer/agent/RuntimeInstrumentor.kt b/src/main/java/com/code_intelligence/jazzer/agent/RuntimeInstrumentor.kt index a1da6bb48..8b8dcc994 100644 --- a/src/main/java/com/code_intelligence/jazzer/agent/RuntimeInstrumentor.kt +++ b/src/main/java/com/code_intelligence/jazzer/agent/RuntimeInstrumentor.kt @@ -215,7 +215,7 @@ class RuntimeInstrumentor( return ClassInstrumentor(internalClassName, bytecode).run { if (fullInstrumentation) { // Coverage instrumentation must be performed before any other code updates - // or there will be additional coverage points injected if there are any call is inserted + // or there will be additional coverage points injected if any calls are inserted // and JaCoCo will produce a broken coverage report. coverageIdSynchronizer.withIdForClass(internalClassName) { firstId -> coverage(firstId).also { actualNumEdgeIds -> From 3fe77e8960f8877372eace019236b101fa405dbb Mon Sep 17 00:00:00 2001 From: Kostiantyn Melnik Date: Fri, 21 Apr 2023 21:59:09 +0300 Subject: [PATCH 3/3] Actualize TC --- tests/src/test/java/com/example/CoverageFuzzer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/src/test/java/com/example/CoverageFuzzer.java b/tests/src/test/java/com/example/CoverageFuzzer.java index 0e84ef6b5..1d65d3b7d 100644 --- a/tests/src/test/java/com/example/CoverageFuzzer.java +++ b/tests/src/test/java/com/example/CoverageFuzzer.java @@ -171,7 +171,7 @@ private static void assertCoverageDump() throws IOException { assertEquals(7, countHits(coverageFuzzerCoverage.getProbes())); assertEquals("com/example/CoverageFuzzer$ClassToCover", classToCoverCoverage.getName()); - assertEquals(11, countHits(classToCoverCoverage.getProbes())); + assertEquals(10, countHits(classToCoverCoverage.getProbes())); } private static int countHits(boolean[] probes) {