[ubsan_minimal] Add __ubsan_report_error_fatal (#138999)
Override may need to know if sanitizer in recover mode.
This commit is contained in:
@@ -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); \
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user