]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: move Segv and TgkillSegv to testprog
authorCherry Mui <cherryyz@google.com>
Fri, 2 Jun 2023 21:54:57 +0000 (17:54 -0400)
committerCherry Mui <cherryyz@google.com>
Mon, 5 Jun 2023 15:24:08 +0000 (15:24 +0000)
The non-cgo test points Segv and TgkillSegv are currently in
testprogcgo. Although the test points don't explicitly use cgo,
being a cgo program, there is still some C code that runs when
the test point is invoked, such as thread creation code.

For the cgo test points, sometimes we fail to unwind the stack if
C code is involved. For the non-cgo ones, we want to always be
able to unwind the stack, so we check for stack unwinding failures.
But if a signal is landed in the small piece of C code mentioned
above, we may still fail to unwind. Move the non-cgo test points
to a pure-Go program to avoid this problem.

May fix #52963.
Updates #59029, #59443, #59492.

Change-Id: I35d99a0dd4c7cdb627e2083d2414887a24a2822d
Reviewed-on: https://go-review.googlesource.com/c/go/+/500535
Reviewed-by: Michael Knyszek <mknyszek@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Cherry Mui <cherryyz@google.com>

src/runtime/crash_cgo_test.go
src/runtime/testdata/testprog/segv.go [new file with mode: 0644]
src/runtime/testdata/testprog/segv_linux.go [new file with mode: 0644]
src/runtime/testdata/testprogcgo/segv.go
src/runtime/testdata/testprogcgo/segv_linux.go

index e3417527c49dfb131e3f5ef30ed0c40bc41b160d..e1851808f3194ed4e60836e89d119274c5b41e64 100644 (file)
@@ -648,7 +648,11 @@ func TestSegv(t *testing.T) {
                        }
 
                        t.Parallel()
-                       got := runTestProg(t, "testprogcgo", test)
+                       prog := "testprog"
+                       if strings.HasSuffix(test, "InCgo") {
+                               prog = "testprogcgo"
+                       }
+                       got := runTestProg(t, prog, test)
                        t.Log(got)
                        want := "SIGSEGV"
                        if !strings.Contains(got, want) {
diff --git a/src/runtime/testdata/testprog/segv.go b/src/runtime/testdata/testprog/segv.go
new file mode 100644 (file)
index 0000000..8547726
--- /dev/null
@@ -0,0 +1,32 @@
+// Copyright 2020 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.
+
+//go:build unix
+
+package main
+
+import "syscall"
+
+func init() {
+       register("Segv", Segv)
+}
+
+var Sum int
+
+func Segv() {
+       c := make(chan bool)
+       go func() {
+               close(c)
+               for i := 0; ; i++ {
+                       Sum += i
+               }
+       }()
+
+       <-c
+
+       syscall.Kill(syscall.Getpid(), syscall.SIGSEGV)
+
+       // Wait for the OS to deliver the signal.
+       select {}
+}
diff --git a/src/runtime/testdata/testprog/segv_linux.go b/src/runtime/testdata/testprog/segv_linux.go
new file mode 100644 (file)
index 0000000..aa386bb
--- /dev/null
@@ -0,0 +1,29 @@
+// Copyright 2022 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 main
+
+import "syscall"
+
+func init() {
+       register("TgkillSegv", TgkillSegv)
+}
+
+func TgkillSegv() {
+       c := make(chan bool)
+       go func() {
+               close(c)
+               for i := 0; ; i++ {
+                       // Sum defined in segv.go.
+                       Sum += i
+               }
+       }()
+
+       <-c
+
+       syscall.Tgkill(syscall.Getpid(), syscall.Gettid(), syscall.SIGSEGV)
+
+       // Wait for the OS to deliver the signal.
+       select {}
+}
index bf5aa313b303f81a2ec74c1c43ff7410c6c94213..c776fe67d9c5f0db597ea344b339e12459d714be 100644 (file)
@@ -3,7 +3,6 @@
 // license that can be found in the LICENSE file.
 
 //go:build unix
-// +build unix
 
 package main
 
@@ -14,29 +13,9 @@ import "C"
 import "syscall"
 
 func init() {
-       register("Segv", Segv)
        register("SegvInCgo", SegvInCgo)
 }
 
-var Sum int
-
-func Segv() {
-       c := make(chan bool)
-       go func() {
-               close(c)
-               for i := 0; ; i++ {
-                       Sum += i
-               }
-       }()
-
-       <-c
-
-       syscall.Kill(syscall.Getpid(), syscall.SIGSEGV)
-
-       // Wait for the OS to deliver the signal.
-       C.pause()
-}
-
 func SegvInCgo() {
        c := make(chan bool)
        go func() {
index fe937787815bb6053d8414d63fb719f756417b96..517ce7209be739db0465a661715280c2ac02cd09 100644 (file)
@@ -11,28 +11,9 @@ import "C"
 import "syscall"
 
 func init() {
-       register("TgkillSegv", TgkillSegv)
        register("TgkillSegvInCgo", TgkillSegvInCgo)
 }
 
-func TgkillSegv() {
-       c := make(chan bool)
-       go func() {
-               close(c)
-               for i := 0; ; i++ {
-                       // Sum defined in segv.go.
-                       Sum += i
-               }
-       }()
-
-       <-c
-
-       syscall.Tgkill(syscall.Getpid(), syscall.Gettid(), syscall.SIGSEGV)
-
-       // Wait for the OS to deliver the signal.
-       C.pause()
-}
-
 func TgkillSegvInCgo() {
        c := make(chan bool)
        go func() {