]> Cypherpunks repositories - gostls13.git/commitdiff
testing: only snapshot coverage during fuzzing
authorRoland Shoemaker <roland@golang.org>
Fri, 7 Jan 2022 20:18:30 +0000 (12:18 -0800)
committerRoland Shoemaker <roland@golang.org>
Mon, 10 Jan 2022 21:48:09 +0000 (21:48 +0000)
Only snapshot/reset coverage counters when we are actually fuzzing.
This prevents a race when running corpus/seed values during the testing
phase.

Fixes #50488

Change-Id: I7dd5a0353a296c0b13eede29ad9af7c78814fa2d
Reviewed-on: https://go-review.googlesource.com/c/go/+/376554
Trust: Katie Hockman <katie@golang.org>
Reviewed-by: Katie Hockman <katie@golang.org>
Trust: Roland Shoemaker <roland@golang.org>
Run-TryBot: Roland Shoemaker <roland@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>

src/cmd/go/testdata/script/test_fuzz_test_race.txt [new file with mode: 0644]
src/testing/fuzz.go

diff --git a/src/cmd/go/testdata/script/test_fuzz_test_race.txt b/src/cmd/go/testdata/script/test_fuzz_test_race.txt
new file mode 100644 (file)
index 0000000..0bbc1fd
--- /dev/null
@@ -0,0 +1,38 @@
+# Test that when both race detection and coverage instrumentation are enabled,
+# and seed values are being executed, the race detector isn't mistakenly
+# triggered.
+
+[short] skip
+[!fuzz] skip
+
+# Test with coverage instrumentation enbaled (-fuzz) and race instrumentation
+# but without actually fuzzing the target (by using a non-matching pattern)
+go test -fuzz=xxx -race -v
+! stderr 'race detected during execution of test'
+
+# Test with just race instrumentation enabled
+go test -race -v
+! stderr 'race detected during execution of test'
+
+# Test with coverage and race instrumentation enabled, and a matching fuzz
+# pattern
+go test -fuzz=FuzzRace -race -v -fuzztime=200x
+! stderr 'race detected during execution of test'
+
+-- go.mod --
+module test
+
+-- race_test.go --
+package race
+
+import "testing"
+
+func FuzzRace(f *testing.F) {
+       for i := 0; i < 100; i++ {
+               f.Add(i)
+       }
+
+       f.Fuzz(func(t *testing.T, i int) {
+               t.Parallel()
+       })
+}
\ No newline at end of file
index 037d531acfcf1cd0f6300883fe03e2dc22265b7a..e1d7544f7a1d89f548e21a859af2ee6dd67127a7 100644 (file)
@@ -327,8 +327,10 @@ func (f *F) Fuzz(ff any) {
                        // we make sure it is called right before the tRunner function
                        // exits, regardless of whether it was executed cleanly, panicked,
                        // or if the fuzzFn called t.Fatal.
-                       defer f.fuzzContext.deps.SnapshotCoverage()
-                       f.fuzzContext.deps.ResetCoverage()
+                       if f.testContext.isFuzzing {
+                               defer f.fuzzContext.deps.SnapshotCoverage()
+                               f.fuzzContext.deps.ResetCoverage()
+                       }
                        fn.Call(args)
                })
                <-t.signal