runtime: move Segv and TgkillSegv to testprog

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>
This commit is contained in:
Cherry Mui 2023-06-02 17:54:57 -04:00
parent 96b79bd320
commit 6dd3bfbed6
5 changed files with 66 additions and 41 deletions

View 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) {

32
src/runtime/testdata/testprog/segv.go vendored Normal file
View File

@ -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 {}
}

View File

@ -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 {}
}

View 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() {

View 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() {