diff options
| author | Space Meyer <spm@google.com> | 2022-10-07 10:08:07 +0000 |
|---|---|---|
| committer | Space Meyer <git@the-space.agency> | 2022-10-07 15:14:53 +0200 |
| commit | 0de35f24a4d2da07a3436f9d227c30d15f508beb (patch) | |
| tree | 6904ff43fb27f0054d8b390ff4350d69f7cd4236 /pkg | |
| parent | 79a5963585ac032cd3f390a37b5d276f7f9d0b5c (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.go | 17 |
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 |
