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  }