[compiler-rt] r373529 - [compiler-rt] Use GetNextInstructionPc in signal handlers

Vitaly Buka via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 2 14:20:37 PDT 2019


Author: vitalybuka
Date: Wed Oct  2 14:20:37 2019
New Revision: 373529

URL: http://llvm.org/viewvc/llvm-project?rev=373529&view=rev
Log:
[compiler-rt] Use GetNextInstructionPc in signal handlers

Summary:
All other stack trace callers assume that PC contains return address.
HWAsan already use GetNextInstructionPc in similar code.

PR43339

Reviewers: eugenis, kcc, jfb

Subscribers: dexonsmith, dberris, #sanitizers, llvm-commits

Tags: #sanitizers, #llvm

Differential Revision: https://reviews.llvm.org/D68313

Added:
    compiler-rt/trunk/test/sanitizer_common/TestCases/Linux/signal_line.cpp
Modified:
    compiler-rt/trunk/lib/asan/asan_errors.cpp
    compiler-rt/trunk/lib/lsan/lsan.cpp
    compiler-rt/trunk/lib/msan/msan.cpp
    compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cpp
    compiler-rt/trunk/lib/ubsan/ubsan_signals_standalone.cpp

Modified: compiler-rt/trunk/lib/asan/asan_errors.cpp
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_errors.cpp?rev=373529&r1=373528&r2=373529&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/asan_errors.cpp (original)
+++ compiler-rt/trunk/lib/asan/asan_errors.cpp Wed Oct  2 14:20:37 2019
@@ -35,7 +35,8 @@ static void OnStackUnwind(const SignalCo
   // corresponding code in the sanitizer_common and we use this callback to
   // print it.
   static_cast<const ScarinessScoreBase *>(callback_context)->Print();
-  stack->Unwind(sig.pc, sig.bp, sig.context, fast);
+  stack->Unwind(StackTrace::GetNextInstructionPc(sig.pc), sig.bp, sig.context,
+                fast);
 }
 
 void ErrorDeadlySignal::Print() {

Modified: compiler-rt/trunk/lib/lsan/lsan.cpp
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/lsan/lsan.cpp?rev=373529&r1=373528&r2=373529&view=diff
==============================================================================
--- compiler-rt/trunk/lib/lsan/lsan.cpp (original)
+++ compiler-rt/trunk/lib/lsan/lsan.cpp Wed Oct  2 14:20:37 2019
@@ -89,7 +89,7 @@ static void InitializeFlags() {
 
 static void OnStackUnwind(const SignalContext &sig, const void *,
                           BufferedStackTrace *stack) {
-  stack->Unwind(sig.pc, sig.bp, sig.context,
+  stack->Unwind(StackTrace::GetNextInstructionPc(sig.pc), sig.bp, sig.context,
                 common_flags()->fast_unwind_on_fatal);
 }
 

Modified: compiler-rt/trunk/lib/msan/msan.cpp
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/msan/msan.cpp?rev=373529&r1=373528&r2=373529&view=diff
==============================================================================
--- compiler-rt/trunk/lib/msan/msan.cpp (original)
+++ compiler-rt/trunk/lib/msan/msan.cpp Wed Oct  2 14:20:37 2019
@@ -378,7 +378,7 @@ void __msan_warning_noreturn() {
 
 static void OnStackUnwind(const SignalContext &sig, const void *,
                           BufferedStackTrace *stack) {
-  stack->Unwind(sig.pc, sig.bp, sig.context,
+  stack->Unwind(StackTrace::GetNextInstructionPc(sig.pc), sig.bp, sig.context,
                 common_flags()->fast_unwind_on_fatal);
 }
 

Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cpp
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cpp?rev=373529&r1=373528&r2=373529&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cpp (original)
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cpp Wed Oct  2 14:20:37 2019
@@ -338,7 +338,7 @@ static void CheckShadowMapping() {
 #if !SANITIZER_GO
 static void OnStackUnwind(const SignalContext &sig, const void *,
                           BufferedStackTrace *stack) {
-  stack->Unwind(sig.pc, sig.bp, sig.context,
+  stack->Unwind(StackTrace::GetNextInstructionPc(sig.pc), sig.bp, sig.context,
                 common_flags()->fast_unwind_on_fatal);
 }
 

Modified: compiler-rt/trunk/lib/ubsan/ubsan_signals_standalone.cpp
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/ubsan/ubsan_signals_standalone.cpp?rev=373529&r1=373528&r2=373529&view=diff
==============================================================================
--- compiler-rt/trunk/lib/ubsan/ubsan_signals_standalone.cpp (original)
+++ compiler-rt/trunk/lib/ubsan/ubsan_signals_standalone.cpp Wed Oct  2 14:20:37 2019
@@ -45,8 +45,9 @@ namespace __ubsan {
 
 static void OnStackUnwind(const SignalContext &sig, const void *,
                           BufferedStackTrace *stack) {
-  ubsan_GetStackTrace(stack, kStackTraceMax, sig.pc, sig.bp, sig.context,
-                common_flags()->fast_unwind_on_fatal);
+  ubsan_GetStackTrace(stack, kStackTraceMax,
+                      StackTrace::GetNextInstructionPc(sig.pc), sig.bp,
+                      sig.context, common_flags()->fast_unwind_on_fatal);
 }
 
 static void UBsanOnDeadlySignal(int signo, void *siginfo, void *context) {

Added: compiler-rt/trunk/test/sanitizer_common/TestCases/Linux/signal_line.cpp
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/sanitizer_common/TestCases/Linux/signal_line.cpp?rev=373529&view=auto
==============================================================================
--- compiler-rt/trunk/test/sanitizer_common/TestCases/Linux/signal_line.cpp (added)
+++ compiler-rt/trunk/test/sanitizer_common/TestCases/Linux/signal_line.cpp Wed Oct  2 14:20:37 2019
@@ -0,0 +1,36 @@
+// Test line numbers in signal handlers
+
+// RUN: %clangxx %s -o %t -O0
+// RUN: %env_tool_opts=handle_segv=1:print_stacktrace=1 not %run %t 1 2>&1 | FileCheck --check-prefixes=CHECK1,CHECK %s
+// RUN: %env_tool_opts=handle_segv=1:print_stacktrace=1 not %run %t 2 2>&1 | FileCheck --check-prefixes=CHECK2,CHECK %s
+// RUN: %env_tool_opts=handle_segv=1:print_stacktrace=1 not %run %t 3 2>&1 | FileCheck --check-prefixes=CHECK3,CHECK %s
+// RUN: %env_tool_opts=handle_segv=1:print_stacktrace=1 not %run %t 4 2>&1 | FileCheck --check-prefixes=CHECK4,CHECK %s
+
+#include <cstdio>
+#include <string>
+
+// CHECK: [[SAN:.*Sanitizer]]:DEADLYSIGNAL
+// CHECK: ERROR: [[SAN]]: SEGV on unknown address {{0x[^ ]*}} (pc
+int main(int argc, char **argv) {
+  int n = atoi(argv[1]);
+
+  if (n == 1)
+    *((volatile int *)0x0) = __LINE__;
+  // CHECK1: #{{[0-9]+ .*}}main {{.*}}signal_line.cpp:[[@LINE-1]]:[[TAB:[0-9]+]]
+  // CHECK1: SUMMARY: [[SAN]]: SEGV {{.*}}signal_line.cpp:[[@LINE-2]]:[[TAB]] in main
+
+  if (n == 2)
+    *((volatile int *)0x0) = __LINE__;
+  // CHECK2: #{{[0-9]+ .*}}main {{.*}}signal_line.cpp:[[@LINE-1]]:[[TAB:[0-9]+]]
+  // CHECK2: SUMMARY: [[SAN]]: SEGV {{.*}}signal_line.cpp:[[@LINE-2]]:[[TAB]] in main
+
+  if (n == 3)
+    *((volatile int *)0x0) = __LINE__;
+  // CHECK3: #{{[0-9]+ .*}}main {{.*}}signal_line.cpp:[[@LINE-1]]:[[TAB:[0-9]+]]
+  // CHECK3: SUMMARY: [[SAN]]: SEGV {{.*}}signal_line.cpp:[[@LINE-2]]:[[TAB]] in main
+
+  if (n == 4)
+    *((volatile int *)0x0) = __LINE__;
+  // CHECK4: #{{[0-9]+ .*}}main {{.*}}signal_line.cpp:[[@LINE-1]]:[[TAB:[0-9]+]]
+  // CHECK4: SUMMARY: [[SAN]]: SEGV {{.*}}signal_line.cpp:[[@LINE-2]]:[[TAB]] in main
+}




More information about the llvm-commits mailing list