[PATCH] D14656: [sanitizer] Stop unwinding the stack when a close-to-zero PC is found

Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 27 08:39:30 PDT 2016


This revision was automatically updated to reflect the committed changes.
Closed by commit rL273886: [sanitizer] Stop unwinding the stack when a close-to-zero PC is found (authored by kuba.brecka).

Changed prior to commit:
  http://reviews.llvm.org/D14656?vs=58101&id=61969#toc

Repository:
  rL LLVM

http://reviews.llvm.org/D14656

Files:
  compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.cc
  compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h
  compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace.cc
  compiler-rt/trunk/lib/sanitizer_common/sanitizer_unwind_linux_libcdep.cc
  compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_stacktrace_test.cc

Index: compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_stacktrace_test.cc
===================================================================
--- compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_stacktrace_test.cc
+++ compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_stacktrace_test.cc
@@ -136,6 +136,19 @@
   EXPECT_EQ(PC(1), trace.trace[1]);
 }
 
+TEST_F(FastUnwindTest, CloseToZeroFrame) {
+  // Make one pc a NULL pointer.
+  fake_stack[5] = 0x0;
+  if (!TryFastUnwind(kStackTraceMax))
+    return;
+  // The stack should be truncated at the NULL pointer (and not include it).
+  EXPECT_EQ(3U, trace.size);
+  EXPECT_EQ(start_pc, trace.trace[0]);
+  for (uptr i = 1; i < 3U; i++) {
+    EXPECT_EQ(PC(i*2 - 1), trace.trace[i]);
+  }
+}
+
 TEST(SlowUnwindTest, ShortStackTrace) {
   if (StackTrace::WillUseFastUnwind(false))
     return;
Index: compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.cc
===================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.cc
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.cc
@@ -25,13 +25,7 @@
 const char *SanitizerToolName = "SanitizerTool";
 
 atomic_uint32_t current_verbosity;
-
-uptr GetPageSizeCached() {
-  static uptr PageSize;
-  if (!PageSize)
-    PageSize = GetPageSize();
-  return PageSize;
-}
+uptr PageSizeCached;
 
 StaticSpinMutex report_file_mu;
 ReportFile report_file = {&report_file_mu, kStderrFd, "", "", 0};
Index: compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace.cc
===================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace.cc
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace.cc
@@ -66,6 +66,7 @@
 
 void BufferedStackTrace::FastUnwindStack(uptr pc, uptr bp, uptr stack_top,
                                          uptr stack_bottom, u32 max_depth) {
+  const uptr kPageSize = GetPageSizeCached();
   CHECK_GE(max_depth, 2);
   trace_buffer[0] = pc;
   size = 1;
@@ -92,6 +93,8 @@
 #else
     uhwptr pc1 = frame[1];
 #endif
+    if (pc1 < kPageSize)
+      break;
     if (pc1 != pc) {
       trace_buffer[size++] = (uptr) pc1;
     }
Index: compiler-rt/trunk/lib/sanitizer_common/sanitizer_unwind_linux_libcdep.cc
===================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_unwind_linux_libcdep.cc
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_unwind_linux_libcdep.cc
@@ -108,6 +108,8 @@
   UnwindTraceArg *arg = (UnwindTraceArg*)param;
   CHECK_LT(arg->stack->size, arg->max_depth);
   uptr pc = Unwind_GetIP(ctx);
+  const uptr kPageSize = GetPageSizeCached();
+  if (pc < kPageSize) return UNWIND_STOP;
   arg->stack->trace_buffer[arg->stack->size++] = pc;
   if (arg->stack->size == arg->max_depth) return UNWIND_STOP;
   return UNWIND_CONTINUE;
Index: compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h
===================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h
@@ -63,7 +63,12 @@
 }
 
 uptr GetPageSize();
-uptr GetPageSizeCached();
+extern uptr PageSizeCached;
+INLINE uptr GetPageSizeCached() {
+  if (!PageSizeCached)
+    PageSizeCached = GetPageSize();
+  return PageSizeCached;
+}
 uptr GetMmapGranularity();
 uptr GetMaxVirtualAddress();
 // Threads


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D14656.61969.patch
Type: text/x-patch
Size: 3444 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160627/0642ae41/attachment.bin>


More information about the llvm-commits mailing list