[compiler-rt] r297665 - [asan] Split SIGSEGV / SIGBUS handling so we can handle only one of them and not the other.

Filipe Cabecinhas via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 13 14:06:42 PDT 2017


Author: filcab
Date: Mon Mar 13 16:06:41 2017
New Revision: 297665

URL: http://llvm.org/viewvc/llvm-project?rev=297665&view=rev
Log:
[asan] Split SIGSEGV / SIGBUS handling so we can handle only one of them and not the other.

Summary: This is useful in some platforms where one of these signals is special.

Reviewers: kubamracek, kcc

Subscribers: llvm-commits

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

Added:
    compiler-rt/trunk/test/asan/TestCases/Posix/asan-sigbus.cpp
Modified:
    compiler-rt/trunk/lib/asan/tests/asan_test.cc
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.inc
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc

Modified: compiler-rt/trunk/lib/asan/tests/asan_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/tests/asan_test.cc?rev=297665&r1=297664&r2=297665&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/tests/asan_test.cc (original)
+++ compiler-rt/trunk/lib/asan/tests/asan_test.cc Mon Mar 13 16:06:41 2017
@@ -945,7 +945,7 @@ TEST(AddressSanitizer, ShadowGapTest) {
   char *addr = (char*)0x0000100000080000;
 # endif
 #endif
-  EXPECT_DEATH(*addr = 1, "AddressSanitizer: SEGV on unknown");
+  EXPECT_DEATH(*addr = 1, "AddressSanitizer: BUS on unknown");
 }
 #endif  // ASAN_NEEDS_SEGV
 

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.inc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.inc?rev=297665&r1=297664&r2=297665&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.inc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.inc Mon Mar 13 16:06:41 2017
@@ -80,7 +80,9 @@ COMMON_FLAG(int, print_module_map, 0,
             "exits, 2 = print after each report.")
 COMMON_FLAG(bool, check_printf, true, "Check printf arguments.")
 COMMON_FLAG(bool, handle_segv, true,
-            "If set, registers the tool's custom SIGSEGV/SIGBUS handler.")
+            "If set, registers the tool's custom SIGSEGV handler.")
+COMMON_FLAG(bool, handle_sigbus, true,
+            "If set, registers the tool's custom SIGBUS handler.")
 COMMON_FLAG(bool, handle_abort, false,
             "If set, registers the tool's custom SIGABRT handler.")
 COMMON_FLAG(bool, handle_sigill, false,

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc?rev=297665&r1=297664&r2=297665&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc Mon Mar 13 16:06:41 2017
@@ -1292,7 +1292,9 @@ bool IsHandledDeadlySignal(int signum) {
     return true;
   if (common_flags()->handle_sigfpe && signum == SIGFPE)
     return true;
-  return (signum == SIGSEGV || signum == SIGBUS) && common_flags()->handle_segv;
+  if (common_flags()->handle_segv && signum == SIGSEGV)
+    return true;
+  return common_flags()->handle_sigbus && signum == SIGBUS;
 }
 
 #if !SANITIZER_GO

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc?rev=297665&r1=297664&r2=297665&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc Mon Mar 13 16:06:41 2017
@@ -404,7 +404,9 @@ bool IsHandledDeadlySignal(int signum) {
     return true;
   if (common_flags()->handle_sigfpe && signum == SIGFPE)
     return true;
-  return (signum == SIGSEGV || signum == SIGBUS) && common_flags()->handle_segv;
+  if (common_flags()->handle_segv && signum == SIGSEGV)
+    return true;
+  return common_flags()->handle_sigbus && signum == SIGBUS;
 }
 
 MacosVersion cached_macos_version = MACOS_VERSION_UNINITIALIZED;

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc?rev=297665&r1=297664&r2=297665&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc Mon Mar 13 16:06:41 2017
@@ -366,8 +366,10 @@ const char *DescribeSignalOrException(in
       return "ILL";
     case SIGABRT:
       return "ABRT";
-    default:
+    case SIGSEGV:
       return "SEGV";
+    case SIGBUS:
+      return "BUS";
   }
   return "UNKNOWN SIGNAL";
 }

Added: compiler-rt/trunk/test/asan/TestCases/Posix/asan-sigbus.cpp
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/TestCases/Posix/asan-sigbus.cpp?rev=297665&view=auto
==============================================================================
--- compiler-rt/trunk/test/asan/TestCases/Posix/asan-sigbus.cpp (added)
+++ compiler-rt/trunk/test/asan/TestCases/Posix/asan-sigbus.cpp Mon Mar 13 16:06:41 2017
@@ -0,0 +1,40 @@
+// Check handle_bus flag
+// Defaults to true
+// RUN: %clangxx_asan -std=c++11 %s -o %t
+// RUN: not %run %t %T/file 2>&1 | FileCheck %s -check-prefix=CHECK-BUS
+// RUN: %env_asan_opts=handle_sigbus=false not --crash %run %t %T/file 2>&1 | FileCheck %s
+
+#include <assert.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/mman.h>
+#include <unistd.h>
+
+char array[4096];
+int main(int argc, char **argv) {
+  assert(argc > 1);
+  int fd = open(argv[1], O_RDWR | O_CREAT, 0700);
+  if (fd < 0) {
+    perror("open");
+    exit(1);
+  }
+  assert(write(fd, array, sizeof(array)) == sizeof(array));
+
+  // Write some zeroes to the file, then mmap it while it has a 4KiB size
+  char *addr = (char *)mmap(nullptr, sizeof(array), PROT_READ,
+                            MAP_FILE | MAP_SHARED, fd, 0);
+  if (addr == MAP_FAILED) {
+    perror("mmap");
+    exit(1);
+  }
+
+  // Truncate the file so our memory isn't valid any more
+  assert(ftruncate(fd, 0) == 0);
+
+  // Try to access the memory
+  return addr[42];
+  // CHECK-NOT: DEADLYSIGNAL
+  // CHECK-BUS: DEADLYSIGNAL
+  // CHECK-BUS: ERROR: AddressSanitizer: BUS
+}




More information about the llvm-commits mailing list