[compiler-rt] d1da41b - [ubsan_minimal] Add __ubsan_report_error_fatal (#138999)

via llvm-commits llvm-commits at lists.llvm.org
Thu May 8 09:58:52 PDT 2025


Author: Vitaly Buka
Date: 2025-05-08T09:58:48-07:00
New Revision: d1da41bf4d271fd9abb9aba37873755feb99e4b6

URL: https://github.com/llvm/llvm-project/commit/d1da41bf4d271fd9abb9aba37873755feb99e4b6
DIFF: https://github.com/llvm/llvm-project/commit/d1da41bf4d271fd9abb9aba37873755feb99e4b6.diff

LOG: [ubsan_minimal] Add __ubsan_report_error_fatal (#138999)

Override may need to know if sanitizer in recover mode.

Added: 
    

Modified: 
    compiler-rt/lib/ubsan_minimal/ubsan_minimal_handlers.cpp
    compiler-rt/test/ubsan_minimal/TestCases/override-callback.c

Removed: 
    


################################################################################
diff  --git a/compiler-rt/lib/ubsan_minimal/ubsan_minimal_handlers.cpp b/compiler-rt/lib/ubsan_minimal/ubsan_minimal_handlers.cpp
index c3ffd41bcacc0..9c03ddf7d063c 100644
--- a/compiler-rt/lib/ubsan_minimal/ubsan_minimal_handlers.cpp
+++ b/compiler-rt/lib/ubsan_minimal/ubsan_minimal_handlers.cpp
@@ -85,6 +85,12 @@ SANITIZER_INTERFACE_WEAK_DEF(void, __ubsan_report_error, const char *kind,
   }
 }
 
+SANITIZER_INTERFACE_WEAK_DEF(void, __ubsan_report_error_fatal, const char *kind,
+                             uintptr_t caller) {
+  // Use another handlers, in case it's already overriden.
+  __ubsan_report_error(kind, caller);
+}
+
 #if defined(__ANDROID__)
 extern "C" __attribute__((weak)) void android_set_abort_message(const char *);
 static void abort_with_message(const char *kind, uintptr_t caller) {
@@ -121,7 +127,7 @@ void NORETURN CheckFailed(const char *file, int, const char *cond, u64, u64) {
 #define HANDLER_NORECOVER(name, kind)                                          \
   INTERFACE void __ubsan_handle_##name##_minimal_abort() {                     \
     uintptr_t caller = GET_CALLER_PC();                                        \
-    __ubsan_report_error(kind, caller);                                        \
+    __ubsan_report_error_fatal(kind, caller);                                  \
     abort_with_message(kind, caller);                                          \
   }
 

diff  --git a/compiler-rt/test/ubsan_minimal/TestCases/override-callback.c b/compiler-rt/test/ubsan_minimal/TestCases/override-callback.c
index e11a3712f1be3..9d326ff1cc54c 100644
--- a/compiler-rt/test/ubsan_minimal/TestCases/override-callback.c
+++ b/compiler-rt/test/ubsan_minimal/TestCases/override-callback.c
@@ -1,4 +1,7 @@
-// RUN: %clang -fsanitize=implicit-integer-sign-change %s -o %t && %run %t 0 2>&1 | FileCheck %s
+// RUN: %clang -fsanitize=implicit-integer-sign-change                                        %s -o %t &&             %run %t 2>&1 | FileCheck %s
+// RUN: %clang -fsanitize=implicit-integer-sign-change -fno-sanitize-recover=all              %s -o %t && not --crash %run %t 2>&1 | FileCheck %s
+// RUN: %clang -fsanitize=implicit-integer-sign-change -fno-sanitize-recover=all -DOVERRIDE=1 %s -o %t && not --crash %run %t 2>&1 | FileCheck %s --check-prefixes=FATAL
+
 #include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -9,7 +12,14 @@ void __ubsan_report_error(const char *kind, uintptr_t caller) {
   fprintf(stderr, "CUSTOM_CALLBACK: %s\n", kind);
 }
 
+#if OVERRIDE
+void __ubsan_report_error_fatal(const char *kind, uintptr_t caller) {
+  fprintf(stderr, "FATAL_CALLBACK: %s\n", kind);
+}
+#endif
+
 int main(int argc, const char **argv) {
   int32_t t0 = (~((uint32_t)0));
   // CHECK: CUSTOM_CALLBACK: implicit-conversion
+  // FATAL: FATAL_CALLBACK: implicit-conversion
 }


        


More information about the llvm-commits mailing list