I need a target executable for some test code that exits due to a SIGSEGV
Right now I have some code like this:
<code>//go:generate bash -c "cc -x c <(echo 'int main() { return *(int*)0; }') -o segv.bin"
func TestSignalledSegV(t *testing.T) {
if _, err := os.Stat("./segv.bin"); errors.Is(err, os.ErrNotExist) {
t.Skipf("To enable this test, run go generate ./...")
}
cwd, err := os.Getwd()
require.NoError(t, err)
k := scriptJobTest(t, `
echo start
exec `+cwd+`/segv.bin
`)
k.requireOutput("start")
k.requireTerminalState("signal: segmentation fault (core dumped)")
}
</code>
<code>//go:generate bash -c "cc -x c <(echo 'int main() { return *(int*)0; }') -o segv.bin"
func TestSignalledSegV(t *testing.T) {
if _, err := os.Stat("./segv.bin"); errors.Is(err, os.ErrNotExist) {
t.Skipf("To enable this test, run go generate ./...")
}
cwd, err := os.Getwd()
require.NoError(t, err)
k := scriptJobTest(t, `
echo start
exec `+cwd+`/segv.bin
`)
k.requireOutput("start")
k.requireTerminalState("signal: segmentation fault (core dumped)")
}
</code>
//go:generate bash -c "cc -x c <(echo 'int main() { return *(int*)0; }') -o segv.bin"
func TestSignalledSegV(t *testing.T) {
if _, err := os.Stat("./segv.bin"); errors.Is(err, os.ErrNotExist) {
t.Skipf("To enable this test, run go generate ./...")
}
cwd, err := os.Getwd()
require.NoError(t, err)
k := scriptJobTest(t, `
echo start
exec `+cwd+`/segv.bin
`)
k.requireOutput("start")
k.requireTerminalState("signal: segmentation fault (core dumped)")
}
I’d like to eliminate the need for an external C compiler for the test.
I tried some code like this:
<code> var f func()
f()
</code>
<code> var f func()
f()
</code>
var f func()
f()
Or even this:
<code> p := unsafe.Pointer(uintptr(0x1000))
f := *(*func())(p)
f()
</code>
<code> p := unsafe.Pointer(uintptr(0x1000))
f := *(*func())(p)
f()
</code>
p := unsafe.Pointer(uintptr(0x1000))
f := *(*func())(p)
f()
but instead of terminating due to SIGSEGV, it hits the fault handler and ultimately does an exit(2)
How do I disable the fault handler?
5