mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-26 02:06:07 +00:00
[ubsan] Support signal specific options in ubsan
Summary: Part of https://github.com/google/sanitizers/issues/637 Standalone ubsan needs signal and sigaction handlers and interceptors. Plugin mode should rely on parent tool. Reviewers: eugenis, alekseyshl Subscribers: kubamracek, llvm-commits, mgorny Differential Revision: https://reviews.llvm.org/D37895 llvm-svn: 314052
This commit is contained in:
parent
2590edf615
commit
c3f431fba3
@ -11,6 +11,7 @@ set(UBSAN_SOURCES
|
||||
set(UBSAN_STANDALONE_SOURCES
|
||||
ubsan_diag_standalone.cc
|
||||
ubsan_init_standalone.cc
|
||||
ubsan_signals_standalone.cc
|
||||
)
|
||||
|
||||
set(UBSAN_CXXABI_SOURCES
|
||||
@ -77,6 +78,7 @@ if(APPLE)
|
||||
RTUbsan_standalone
|
||||
RTSanitizerCommon
|
||||
RTSanitizerCommonLibc
|
||||
RTInterception
|
||||
LINK_FLAGS ${WEAK_SYMBOL_LINK_FLAGS}
|
||||
PARENT_TARGET ubsan)
|
||||
endif()
|
||||
@ -144,6 +146,7 @@ else()
|
||||
RTSanitizerCommonLibc
|
||||
RTUbsan
|
||||
RTUbsan_standalone
|
||||
RTInterception
|
||||
CFLAGS ${UBSAN_CFLAGS}
|
||||
PARENT_TARGET ubsan)
|
||||
|
||||
@ -162,6 +165,7 @@ else()
|
||||
RTSanitizerCommonLibc
|
||||
RTUbsan
|
||||
RTUbsan_standalone
|
||||
RTInterception
|
||||
CFLAGS ${UBSAN_CFLAGS}
|
||||
LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS}
|
||||
LINK_LIBS ${UBSAN_DYNAMIC_LIBS}
|
||||
|
@ -18,11 +18,17 @@
|
||||
|
||||
#include "sanitizer_common/sanitizer_internal_defs.h"
|
||||
#include "ubsan_init.h"
|
||||
#include "ubsan_signals_standalone.h"
|
||||
|
||||
namespace __ubsan {
|
||||
|
||||
class UbsanStandaloneInitializer {
|
||||
public:
|
||||
UbsanStandaloneInitializer() {
|
||||
__ubsan::InitAsStandalone();
|
||||
InitAsStandalone();
|
||||
InitializeDeadlySignals();
|
||||
}
|
||||
};
|
||||
static UbsanStandaloneInitializer ubsan_standalone_initializer;
|
||||
|
||||
} // namespace __ubsan
|
||||
|
@ -19,8 +19,19 @@
|
||||
|
||||
#include "sanitizer_common/sanitizer_internal_defs.h"
|
||||
#include "ubsan_init.h"
|
||||
#include "ubsan_signals_standalone.h"
|
||||
|
||||
#if SANITIZER_CAN_USE_PREINIT_ARRAY
|
||||
|
||||
namespace __ubsan {
|
||||
|
||||
static void PreInitAsStandalone() {
|
||||
InitAsStandalone();
|
||||
InitializeDeadlySignals();
|
||||
}
|
||||
|
||||
} // namespace __ubsan
|
||||
|
||||
__attribute__((section(".preinit_array"), used)) void (*__local_ubsan_preinit)(
|
||||
void) = __ubsan::InitAsStandalone;
|
||||
void) = __ubsan::PreInitAsStandalone;
|
||||
#endif // SANITIZER_CAN_USE_PREINIT_ARRAY
|
||||
|
50
compiler-rt/lib/ubsan/ubsan_signals_standalone.cc
Normal file
50
compiler-rt/lib/ubsan/ubsan_signals_standalone.cc
Normal file
@ -0,0 +1,50 @@
|
||||
//=-- ubsan_signals_standalone.cc
|
||||
//------------------------------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// Installs signal handlers and related interceptors for UBSan standalone.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "ubsan_platform.h"
|
||||
#if CAN_SANITIZE_UB
|
||||
#include "interception/interception.h"
|
||||
#include "sanitizer_common/sanitizer_stacktrace.h"
|
||||
#include "ubsan_diag.h"
|
||||
#include "ubsan_init.h"
|
||||
|
||||
#define COMMON_INTERCEPT_FUNCTION(name) INTERCEPT_FUNCTION(name)
|
||||
#include "sanitizer_common/sanitizer_signal_interceptors.inc"
|
||||
|
||||
namespace __ubsan {
|
||||
|
||||
static void OnStackUnwind(const SignalContext &sig, const void *,
|
||||
BufferedStackTrace *stack) {
|
||||
GetStackTraceWithPcBpAndContext(stack, kStackTraceMax, sig.pc, sig.bp,
|
||||
sig.context,
|
||||
common_flags()->fast_unwind_on_fatal);
|
||||
}
|
||||
|
||||
static void UBsanOnDeadlySignal(int signo, void *siginfo, void *context) {
|
||||
HandleDeadlySignal(siginfo, context, GetTid(), &OnStackUnwind, nullptr);
|
||||
}
|
||||
|
||||
static bool is_initialized = false;
|
||||
|
||||
void InitializeDeadlySignals() {
|
||||
if (is_initialized)
|
||||
return;
|
||||
is_initialized = true;
|
||||
InitializeSignalInterceptors();
|
||||
InstallDeadlySignalHandlers(&UBsanOnDeadlySignal);
|
||||
}
|
||||
|
||||
} // namespace __ubsan
|
||||
|
||||
#endif // CAN_SANITIZE_UB
|
25
compiler-rt/lib/ubsan/ubsan_signals_standalone.h
Normal file
25
compiler-rt/lib/ubsan/ubsan_signals_standalone.h
Normal file
@ -0,0 +1,25 @@
|
||||
//=-- ubsan_signals_standalone.h
|
||||
//------------------------------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// Installs signal handlers and related interceptors for UBSan standalone.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef UBSAN_SIGNALS_STANDALONE_H
|
||||
#define UBSAN_SIGNALS_STANDALONE_H
|
||||
|
||||
namespace __ubsan {
|
||||
|
||||
// Initializes signal handlers and interceptors.
|
||||
void InitializeDeadlySignals();
|
||||
|
||||
} // namespace __ubsan
|
||||
|
||||
#endif // UBSAN_SIGNALS_STANDALONE_H
|
@ -20,7 +20,6 @@
|
||||
// Remove when fixed: https://github.com/google/sanitizers/issues/637
|
||||
// XFAIL: msan
|
||||
// XFAIL: tsan
|
||||
// XFAIL: ubsan
|
||||
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
|
@ -7,10 +7,9 @@
|
||||
// RUN: env %tool_options='abort_on_error=0, dedup_token_length=3' not %run %t 2>&1 | FileCheck %s --check-prefix=CHECK3 --match-full-lines
|
||||
|
||||
// REQUIRES: stable-runtime
|
||||
// FIXME: implement SEGV handler in other sanitizers, not just asan.
|
||||
// FIXME: implement SEGV handler in other sanitizers.
|
||||
// XFAIL: msan
|
||||
// XFAIL: tsan
|
||||
// XFAIL: ubsan
|
||||
|
||||
volatile int *null = 0;
|
||||
|
||||
|
@ -11,7 +11,6 @@
|
||||
// FIXME: implement in other sanitizers.
|
||||
// XFAIL: msan
|
||||
// XFAIL: tsan
|
||||
// XFAIL: ubsan
|
||||
|
||||
int main() {
|
||||
#if defined(__x86_64__)
|
||||
|
@ -9,7 +9,6 @@
|
||||
// FIXME: implement SEGV handler in other sanitizers, not just asan.
|
||||
// XFAIL: msan
|
||||
// XFAIL: tsan
|
||||
// XFAIL: ubsan
|
||||
|
||||
#include <sanitizer/common_interface_defs.h>
|
||||
#include <stdio.h>
|
||||
|
Loading…
x
Reference in New Issue
Block a user