aboutsummaryrefslogtreecommitdiffstats
path: root/pkg
diff options
context:
space:
mode:
authorSpace Meyer <spm@google.com>2022-10-07 10:08:07 +0000
committerSpace Meyer <git@the-space.agency>2022-10-07 15:14:53 +0200
commit0de35f24a4d2da07a3436f9d227c30d15f508beb (patch)
tree6904ff43fb27f0054d8b390ff4350d69f7cd4236 /pkg
parent79a5963585ac032cd3f390a37b5d276f7f9d0b5c (diff)
pkg/cover: mitigate datarace in generateReport
After merging #3409 the test case TestReportGenerator became flaky[0]. The problem is caused by our tests using the same 'Test' struct instance in multiple tests in parallel. Hence when overwriting test.Progs in one test run, another test run might be reading it at the same time. [0] https://github.com/google/syzkaller/actions/runs/3198309451/jobs/5222669976
Diffstat (limited to 'pkg')
-rw-r--r--pkg/cover/report_test.go17
1 files changed, 12 insertions, 5 deletions
diff --git a/pkg/cover/report_test.go b/pkg/cover/report_test.go
index e0821ce0b..e9fc391bf 100644
--- a/pkg/cover/report_test.go
+++ b/pkg/cover/report_test.go
@@ -260,6 +260,13 @@ func generateReport(t *testing.T, target *targets.Target, test Test) ([]byte, []
},
}
+ // Deep copy, as we are going to modify progs. Our test generate multiple reports from the same
+ // test object in parallel. Without copying we have a datarace here.
+ progs := []Prog{}
+ for _, p := range test.Progs {
+ progs = append(progs, Prog{Sig: p.Sig, Data: p.Data, PCs: append([]uint64{}, p.PCs...)})
+ }
+
rg, err := MakeReportGenerator(target, "", dir, dir, dir, subsystem, nil, nil, false)
if err != nil {
return nil, nil, err
@@ -297,23 +304,23 @@ func generateReport(t *testing.T, target *targets.Target, test Test) ([]byte, []
}
t.Logf("using inexact coverage range 0x%x-0x%x", main.Addr, main.Addr+uint64(main.Size))
}
- test.Progs = append(test.Progs, Prog{Data: "main", PCs: pcs})
+ progs = append(progs, Prog{Data: "main", PCs: pcs})
}
html := new(bytes.Buffer)
- if err := rg.DoHTML(html, test.Progs, nil); err != nil {
+ if err := rg.DoHTML(html, progs, nil); err != nil {
return nil, nil, err
}
htmlTable := new(bytes.Buffer)
- if err := rg.DoHTMLTable(htmlTable, test.Progs, nil); err != nil {
+ if err := rg.DoHTMLTable(htmlTable, progs, nil); err != nil {
return nil, nil, err
}
_ = htmlTable
csv := new(bytes.Buffer)
- if err := rg.DoCSV(csv, test.Progs, nil); err != nil {
+ if err := rg.DoCSV(csv, progs, nil); err != nil {
return nil, nil, err
}
csvFiles := new(bytes.Buffer)
- if err := rg.DoCSVFiles(csvFiles, test.Progs, nil); err != nil {
+ if err := rg.DoCSVFiles(csvFiles, progs, nil); err != nil {
return nil, nil, err
}
_ = csvFiles