From 3c1c0d9cb66350966a8c96f707d1494ae74726d9 Mon Sep 17 00:00:00 2001 From: Xinhao Yuan Date: Fri, 6 Mar 2026 13:22:37 -0800 Subject: [PATCH] No public description PiperOrigin-RevId: 879790475 --- fuzztest/internal/BUILD | 1 + fuzztest/internal/CMakeLists.txt | 1 + fuzztest/internal/googletest_adaptor.h | 1 + fuzztest/internal/runtime.cc | 11 ++++++++++- 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/fuzztest/internal/BUILD b/fuzztest/internal/BUILD index c5d988ae..c016da5f 100644 --- a/fuzztest/internal/BUILD +++ b/fuzztest/internal/BUILD @@ -372,6 +372,7 @@ cc_library( ":serialization", ":status", "@abseil-cpp//absl/base:core_headers", + "@abseil-cpp//absl/cleanup", "@abseil-cpp//absl/functional:any_invocable", "@abseil-cpp//absl/functional:bind_front", "@abseil-cpp//absl/functional:function_ref", diff --git a/fuzztest/internal/CMakeLists.txt b/fuzztest/internal/CMakeLists.txt index 1a674bcd..ffd91d3f 100644 --- a/fuzztest/internal/CMakeLists.txt +++ b/fuzztest/internal/CMakeLists.txt @@ -341,6 +341,7 @@ fuzztest_cc_library( fuzztest::sanitizer_interface fuzztest::serialization fuzztest::status + absl::cleanup absl::core_headers absl::any_invocable absl::bind_front diff --git a/fuzztest/internal/googletest_adaptor.h b/fuzztest/internal/googletest_adaptor.h index 98e8a8a4..ba107ebe 100644 --- a/fuzztest/internal/googletest_adaptor.h +++ b/fuzztest/internal/googletest_adaptor.h @@ -93,6 +93,7 @@ class GTest_TestAdaptor : public ::testing::Test { EXPECT_TRUE(test->RunInFuzzingMode(argc_, argv_, configuration_)) << "Failure(s) found in the fuzzing mode."; } + EXPECT_FALSE(Runtime::instance().external_failure_detected()); } static void SetUpTestSuite() { diff --git a/fuzztest/internal/runtime.cc b/fuzztest/internal/runtime.cc index 24e094f2..6d562825 100644 --- a/fuzztest/internal/runtime.cc +++ b/fuzztest/internal/runtime.cc @@ -38,6 +38,7 @@ #include #include +#include "absl/cleanup/cleanup.h" #include "absl/functional/bind_front.h" #include "absl/functional/function_ref.h" #include "absl/random/bit_gen_ref.h" @@ -576,6 +577,10 @@ static void HandleCrash(int signum, siginfo_t* info, void* ucontext) { if (!has_old_handler || signum != SIGTRAP || (info->si_code != TRAP_PERF && info->si_code != SI_TIMER)) { // Dump our info first. + absl::Format(&signal_out_sink, + "[!] Reporting crashing signal %d as an external failure.\n", + signum); + runtime.SetExternalFailureDetected(true); runtime.PrintReport(&signal_out_sink); // The old signal handler might print important messages (e.g., strack // trace) to the original file descriptors, therefore we restore them before @@ -597,7 +602,7 @@ static void HandleCrash(int signum, siginfo_t* info, void* ucontext) { raise(signum); absl::Format(&signal_out_sink, "[!] The default action of crashing signal %d did not crash - " - "aborting", + "aborting\n", signum); // At this point abort should be fine even if signum == SIGABRT. std::abort(); @@ -751,7 +756,11 @@ bool FuzzTestFuzzerImpl::ReplayInputsIfAvailable( const Configuration& configuration) { // Crashing inputs are discovered in fuzzing mode. To increase the chance of // reproducing the crash, fuzzing mode should be used. + const auto old_run_mode = runtime_.run_mode(); runtime_.SetRunMode(RunMode::kFuzz); + absl::Cleanup restore_run_mode = [this, old_run_mode]() { + runtime_.SetRunMode(old_run_mode); + }; auto replay_input = absl::bind_front(&FuzzTestFuzzerImpl::ReplayInput, this); if (const auto file_paths = GetFilesToReplay()) {