123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- // Copyright 2016 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
- // This program failed when run under the C/C++ ThreadSanitizer. The TSAN
- // sigaction function interceptor returned SIG_DFL instead of the Go runtime's
- // handler in registerSegvForwarder.
- /*
- #cgo CFLAGS: -fsanitize=thread
- #cgo LDFLAGS: -fsanitize=thread
- #include <signal.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- struct sigaction prev_sa;
- void forwardSignal(int signo, siginfo_t *info, void *context) {
- // One of sa_sigaction and/or sa_handler
- if ((prev_sa.sa_flags&SA_SIGINFO) != 0) {
- prev_sa.sa_sigaction(signo, info, context);
- return;
- }
- if (prev_sa.sa_handler != SIG_IGN && prev_sa.sa_handler != SIG_DFL) {
- prev_sa.sa_handler(signo);
- return;
- }
- fprintf(stderr, "No Go handler to forward to!\n");
- abort();
- }
- void registerSegvFowarder() {
- struct sigaction sa;
- memset(&sa, 0, sizeof(sa));
- sigemptyset(&sa.sa_mask);
- sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
- sa.sa_sigaction = forwardSignal;
- if (sigaction(SIGSEGV, &sa, &prev_sa) != 0) {
- perror("failed to register SEGV forwarder");
- exit(EXIT_FAILURE);
- }
- }
- */
- import "C"
- func main() {
- C.registerSegvFowarder()
- defer func() {
- recover()
- }()
- var nilp *int
- *nilp = 42
- }
|