mirror of
https://github.com/golang/go
synced 2024-11-14 08:50:22 -07:00
e2f8766c30
Otherwise it is possible that msan will consider the C result to be partially initialized, which may cause msan to think that the Go stack is partially uninitialized. The compiler will never mark the stack as initialized, so without this CL it is possible for stack addresses to be passed to msanread, which will cause a false positive error from msan. Fixes #26209 Change-Id: I43a502beefd626eb810ffd8753e269a55dff8248 Reviewed-on: https://go-review.googlesource.com/122196 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
57 lines
1.2 KiB
Go
57 lines
1.2 KiB
Go
// Copyright 2017 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package sanitizers_test
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestMSAN(t *testing.T) {
|
|
t.Parallel()
|
|
requireOvercommit(t)
|
|
config := configure("memory")
|
|
config.skipIfCSanitizerBroken(t)
|
|
|
|
mustRun(t, config.goCmd("build", "std"))
|
|
|
|
cases := []struct {
|
|
src string
|
|
wantErr bool
|
|
}{
|
|
{src: "msan.go"},
|
|
{src: "msan2.go"},
|
|
{src: "msan2_cmsan.go"},
|
|
{src: "msan3.go"},
|
|
{src: "msan4.go"},
|
|
{src: "msan5.go"},
|
|
{src: "msan6.go"},
|
|
{src: "msan_fail.go", wantErr: true},
|
|
}
|
|
for _, tc := range cases {
|
|
tc := tc
|
|
name := strings.TrimSuffix(tc.src, ".go")
|
|
t.Run(name, func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
dir := newTempDir(t)
|
|
defer dir.RemoveAll(t)
|
|
|
|
outPath := dir.Join(name)
|
|
mustRun(t, config.goCmd("build", "-o", outPath, srcPath(tc.src)))
|
|
|
|
cmd := hangProneCmd(outPath)
|
|
if tc.wantErr {
|
|
out, err := cmd.CombinedOutput()
|
|
if err != nil {
|
|
return
|
|
}
|
|
t.Fatalf("%#q exited without error; want MSAN failure\n%s", strings.Join(cmd.Args, " "), out)
|
|
}
|
|
mustRun(t, cmd)
|
|
})
|
|
}
|
|
}
|