From 0de35f24a4d2da07a3436f9d227c30d15f508beb Mon Sep 17 00:00:00 2001 From: Space Meyer Date: Fri, 7 Oct 2022 10:08:07 +0000 Subject: 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 --- pkg/cover/report_test.go | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'pkg') 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 -- cgit mrf-deployment