cshared_test.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. package sanitizers_test
  5. import (
  6. "fmt"
  7. "os"
  8. "strings"
  9. "testing"
  10. )
  11. func TestShared(t *testing.T) {
  12. t.Parallel()
  13. requireOvercommit(t)
  14. GOOS, err := goEnv("GOOS")
  15. if err != nil {
  16. t.Fatal(err)
  17. }
  18. GOARCH, err := goEnv("GOARCH")
  19. if err != nil {
  20. t.Fatal(err)
  21. }
  22. libExt := "so"
  23. if GOOS == "darwin" {
  24. libExt = "dylib"
  25. }
  26. cases := []struct {
  27. src string
  28. sanitizer string
  29. }{
  30. {
  31. src: "msan_shared.go",
  32. sanitizer: "memory",
  33. },
  34. {
  35. src: "tsan_shared.go",
  36. sanitizer: "thread",
  37. },
  38. }
  39. for _, tc := range cases {
  40. tc := tc
  41. name := strings.TrimSuffix(tc.src, ".go")
  42. //The memory sanitizer tests require support for the -msan option.
  43. if tc.sanitizer == "memory" && !mSanSupported(GOOS, GOARCH) {
  44. t.Logf("skipping %s test on %s/%s; -msan option is not supported.", name, GOOS, GOARCH)
  45. continue
  46. }
  47. t.Run(name, func(t *testing.T) {
  48. t.Parallel()
  49. config := configure(tc.sanitizer)
  50. config.skipIfCSanitizerBroken(t)
  51. dir := newTempDir(t)
  52. defer dir.RemoveAll(t)
  53. lib := dir.Join(fmt.Sprintf("lib%s.%s", name, libExt))
  54. mustRun(t, config.goCmd("build", "-buildmode=c-shared", "-o", lib, srcPath(tc.src)))
  55. cSrc := dir.Join("main.c")
  56. if err := os.WriteFile(cSrc, cMain, 0600); err != nil {
  57. t.Fatalf("failed to write C source file: %v", err)
  58. }
  59. dstBin := dir.Join(name)
  60. cmd, err := cc(config.cFlags...)
  61. if err != nil {
  62. t.Fatal(err)
  63. }
  64. cmd.Args = append(cmd.Args, config.ldFlags...)
  65. cmd.Args = append(cmd.Args, "-o", dstBin, cSrc, lib)
  66. mustRun(t, cmd)
  67. cmd = hangProneCmd(dstBin)
  68. replaceEnv(cmd, "LD_LIBRARY_PATH", ".")
  69. mustRun(t, cmd)
  70. })
  71. }
  72. }