1
2
3
4
5
6
7 package sanitizers_test
8
9 import (
10 "internal/platform"
11 "internal/testenv"
12 "strings"
13 "testing"
14 )
15
16 func TestMSAN(t *testing.T) {
17 testenv.MustHaveGoBuild(t)
18 testenv.MustHaveCGO(t)
19 goos, err := goEnv("GOOS")
20 if err != nil {
21 t.Fatal(err)
22 }
23 goarch, err := goEnv("GOARCH")
24 if err != nil {
25 t.Fatal(err)
26 }
27
28 if !platform.MSanSupported(goos, goarch) {
29 t.Skipf("skipping on %s/%s; -msan option is not supported.", goos, goarch)
30 }
31
32 t.Parallel()
33
34
35 if goos == "linux" {
36 requireOvercommit(t)
37 }
38 config := configure("memory")
39 config.skipIfCSanitizerBroken(t)
40
41 mustRun(t, config.goCmd("build", "std"))
42
43 cases := []struct {
44 src string
45 wantErr bool
46 experiments []string
47 }{
48 {src: "msan.go"},
49 {src: "msan2.go"},
50 {src: "msan2_cmsan.go"},
51 {src: "msan3.go"},
52 {src: "msan4.go"},
53 {src: "msan5.go"},
54 {src: "msan6.go"},
55 {src: "msan7.go"},
56 {src: "msan8.go"},
57 {src: "msan_fail.go", wantErr: true},
58
59
60
61
62 {src: "arena_fail.go", wantErr: true, experiments: []string{"arenas"}},
63 }
64 for _, tc := range cases {
65 name := strings.TrimSuffix(tc.src, ".go")
66 t.Run(name, func(t *testing.T) {
67 t.Parallel()
68
69 dir := newTempDir(t)
70 defer dir.RemoveAll(t)
71
72 outPath := dir.Join(name)
73 mustRun(t, config.goCmdWithExperiments("build", []string{"-o", outPath, srcPath(tc.src)}, tc.experiments))
74
75 cmd := hangProneCmd(outPath)
76 if tc.wantErr {
77 out, err := cmd.CombinedOutput()
78 if err != nil {
79 return
80 }
81 t.Fatalf("%#q exited without error; want MSAN failure\n%s", cmd, out)
82 }
83 mustRun(t, cmd)
84 })
85 }
86 }
87
View as plain text