[compiler-rt][libFuzzer] Add support for capturing SIGTRAP exits. (#149120) Swift's FatalError raises a SIGTRAP, which currently causes the fuzzer to exit without writing out the crashing input. rdar://142975522 GitOrigin-RevId: 33cc58f46f0c163d4bea2c7212b3830b3adf99b3
diff --git a/FuzzerDriver.cpp b/FuzzerDriver.cpp index 40322e2..ad3a65a 100644 --- a/FuzzerDriver.cpp +++ b/FuzzerDriver.cpp
@@ -834,6 +834,7 @@ Options.HandleInt = Flags.handle_int; Options.HandleSegv = Flags.handle_segv; Options.HandleTerm = Flags.handle_term; + Options.HandleTrap = Flags.handle_trap; Options.HandleXfsz = Flags.handle_xfsz; Options.HandleUsr1 = Flags.handle_usr1; Options.HandleUsr2 = Flags.handle_usr2;
diff --git a/FuzzerFlags.def b/FuzzerFlags.def index b88458a..96282b8 100644 --- a/FuzzerFlags.def +++ b/FuzzerFlags.def
@@ -152,6 +152,7 @@ FUZZER_FLAG_INT(handle_fpe, 1, "If 1, try to intercept SIGFPE.") FUZZER_FLAG_INT(handle_int, 1, "If 1, try to intercept SIGINT.") FUZZER_FLAG_INT(handle_term, 1, "If 1, try to intercept SIGTERM.") +FUZZER_FLAG_INT(handle_trap, 1, "If 1, try to intercept SIGTRAP.") FUZZER_FLAG_INT(handle_xfsz, 1, "If 1, try to intercept SIGXFSZ.") FUZZER_FLAG_INT(handle_usr1, 1, "If 1, try to intercept SIGUSR1.") FUZZER_FLAG_INT(handle_usr2, 1, "If 1, try to intercept SIGUSR2.")
diff --git a/FuzzerOptions.h b/FuzzerOptions.h index 72e2561..6478b63 100644 --- a/FuzzerOptions.h +++ b/FuzzerOptions.h
@@ -82,6 +82,7 @@ bool HandleInt = false; bool HandleSegv = false; bool HandleTerm = false; + bool HandleTrap = false; bool HandleXfsz = false; bool HandleUsr1 = false; bool HandleUsr2 = false;
diff --git a/FuzzerUtilFuchsia.cpp b/FuzzerUtilFuchsia.cpp index 735d155..7f065c7 100644 --- a/FuzzerUtilFuchsia.cpp +++ b/FuzzerUtilFuchsia.cpp
@@ -410,7 +410,7 @@ // Early exit if no crash handler needed. if (!Options.HandleSegv && !Options.HandleBus && !Options.HandleIll && - !Options.HandleFpe && !Options.HandleAbrt) + !Options.HandleFpe && !Options.HandleAbrt && !Options.HandleTrap) return; // Set up the crash handler and wait until it is ready before proceeding.
diff --git a/FuzzerUtilPosix.cpp b/FuzzerUtilPosix.cpp index 392c1e5..ae22ecf 100644 --- a/FuzzerUtilPosix.cpp +++ b/FuzzerUtilPosix.cpp
@@ -132,6 +132,8 @@ SetSigaction(SIGILL, CrashHandler); if (Options.HandleFpe) SetSigaction(SIGFPE, CrashHandler); + if (Options.HandleTrap) + SetSigaction(SIGTRAP, CrashHandler); if (Options.HandleXfsz) SetSigaction(SIGXFSZ, FileSizeExceedHandler); if (Options.HandleUsr1)