github.com/guyezi/gofrontend@v0.0.0-20200228202240-7a62a49e62c0/libgo/misc/cgo/testsanitizers/cshared_test.go (about) 1 // Copyright 2017 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package sanitizers_test 6 7 import ( 8 "fmt" 9 "io/ioutil" 10 "strings" 11 "testing" 12 ) 13 14 func TestShared(t *testing.T) { 15 t.Parallel() 16 requireOvercommit(t) 17 18 GOOS, err := goEnv("GOOS") 19 if err != nil { 20 t.Fatal(err) 21 } 22 libExt := "so" 23 if GOOS == "darwin" { 24 libExt = "dylib" 25 } 26 27 cases := []struct { 28 src string 29 sanitizer string 30 }{ 31 { 32 src: "msan_shared.go", 33 sanitizer: "memory", 34 }, 35 { 36 src: "tsan_shared.go", 37 sanitizer: "thread", 38 }, 39 } 40 41 for _, tc := range cases { 42 tc := tc 43 name := strings.TrimSuffix(tc.src, ".go") 44 t.Run(name, func(t *testing.T) { 45 t.Parallel() 46 config := configure(tc.sanitizer) 47 config.skipIfCSanitizerBroken(t) 48 49 dir := newTempDir(t) 50 defer dir.RemoveAll(t) 51 52 lib := dir.Join(fmt.Sprintf("lib%s.%s", name, libExt)) 53 mustRun(t, config.goCmd("build", "-buildmode=c-shared", "-o", lib, srcPath(tc.src))) 54 55 cSrc := dir.Join("main.c") 56 if err := ioutil.WriteFile(cSrc, cMain, 0600); err != nil { 57 t.Fatalf("failed to write C source file: %v", err) 58 } 59 60 dstBin := dir.Join(name) 61 cmd, err := cc(config.cFlags...) 62 if err != nil { 63 t.Fatal(err) 64 } 65 cmd.Args = append(cmd.Args, config.ldFlags...) 66 cmd.Args = append(cmd.Args, "-o", dstBin, cSrc, lib) 67 mustRun(t, cmd) 68 69 cmd = hangProneCmd(dstBin) 70 replaceEnv(cmd, "LD_LIBRARY_PATH", ".") 71 mustRun(t, cmd) 72 }) 73 } 74 }