Home | History | Annotate | Download | only in testsanitizers
      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 }
     75