[compiler-rt] r192979 - [asan] reduce the size of AsanThreadContext by storing the stack trace in the stack depot

Kostya Serebryany kcc at google.com
Fri Oct 18 10:50:16 PDT 2013


Thanks!
Hopefully fixed by r192990.


On Fri, Oct 18, 2013 at 8:39 PM, Alexander Potapenko <glider at google.com>wrote:

> GCD tests are failing when trying to print the thread creation stack.
> Perhaps you're dereferencing NULL somewhere (not sure we're keeping
> the creation stack for GCD workers):
>
> [       OK ] AddressSanitizerMac.CFAllocatorMallocDoubleFree (746 ms)
> [ RUN      ] AddressSanitizerMac.GCDDispatchAsync
>
> /Users/buildbot/src/llvm-buildbot/slave/mac10.8-cmake/build/llvm/projects/compiler-rt/lib/asan/tests/asan_mac_test.cc:92:
> Failure
> Death test: TestGCDDispatchAsync()
>     Result: died but not with expected error.
>   Expected: Shadow byte legend
> Actual msg:
> [  DEATH   ]
> =================================================================
> [  DEATH   ] ==44993==ERROR: AddressSanitizer: heap-buffer-overflow on
> address 0x61900002fc80 at pc 0x10eacfd2f bp 0x112528560 sp 0x112528558
> [  DEATH   ] WRITE of size 1 at 0x61900002fc80 thread T1
> [  DEATH   ]     #0 0x10eacfd2e
>
> (/Users/buildbot/src/llvm-buildbot/slave/mac10.8-cmake/build/./llvm_build64/projects/compiler-rt/lib/asan/tests/Asan-x86_64-Test+0x100204d2e)
> [  DEATH   ]     #1 0x10ead0507
>
> (/Users/buildbot/src/llvm-buildbot/slave/mac10.8-cmake/build/./llvm_build64/projects/compiler-rt/lib/asan/tests/Asan-x86_64-Test+0x100205507)
> [  DEATH   ]     #2 0x10ecbfad3
>
> (/Users/buildbot/src/llvm-buildbot/slave/mac10.8-cmake/build/llvm_build64/lib/clang/3.4/lib/darwin/libclang_rt.asan_osx_dynamic.dylib+0x1aad3)
> [  DEATH   ]     #3 0x7fff8f0f0f00
> (/usr/lib/system/libdispatch.dylib+0x5f00)
> [  DEATH   ]     #4 0x7fff8f0ed0b5
> (/usr/lib/system/libdispatch.dylib+0x20b5)
> [  DEATH   ]     #5 0x7fff8f0ee1f9
> (/usr/lib/system/libdispatch.dylib+0x31f9)
> [  DEATH   ]     #6 0x7fff94a3bcda
> (/usr/lib/system/libsystem_c.dylib+0x16cda)
> [  DEATH   ]     #7 0x7fff94a26190
> (/usr/lib/system/libsystem_c.dylib+0x1190)
> [  DEATH   ] 0x61900002fc80 is located 0 bytes to the right of
> 1024-byte region [0x61900002f880,0x61900002fc80)
> [  DEATH   ] allocated by thread T1 here:
> [  DEATH   ]     #0 0x10ecc04c5
>
> (/Users/buildbot/src/llvm-buildbot/slave/mac10.8-cmake/build/llvm_build64/lib/clang/3.4/lib/darwin/libclang_rt.asan_osx_dynamic.dylib+0x1b4c5)
> [  DEATH   ]     #1 0x10ead04d8
>
> (/Users/buildbot/src/llvm-buildbot/slave/mac10.8-cmake/build/./llvm_build64/projects/compiler-rt/lib/asan/tests/Asan-x86_64-Test+0x1002054d8)
> [  DEATH   ]     #2 0x10ecbfad3
>
> (/Users/buildbot/src/llvm-buildbot/slave/mac10.8-cmake/build/llvm_build64/lib/clang/3.4/lib/darwin/libclang_rt.asan_osx_dynamic.dylib+0x1aad3)
> [  DEATH   ]     #3 0x7fff8f0f0f00
> (/usr/lib/system/libdispatch.dylib+0x5f00)
> [  DEATH   ]     #4 0x7fff8f0ed0b5
> (/usr/lib/system/libdispatch.dylib+0x20b5)
> [  DEATH   ]     #5 0x7fff8f0ee1f9
> (/usr/lib/system/libdispatch.dylib+0x31f9)
> [  DEATH   ]     #6 0x7fff94a3bcda
> (/usr/lib/system/libsystem_c.dylib+0x16cda)
> [  DEATH   ]     #7 0x7fff94a26190
> (/usr/lib/system/libsystem_c.dylib+0x1190)
> [  DEATH   ] Thread T1 created by T0 here:
> [  DEATH   ] ASAN:SIGSEGV
> [  DEATH   ] ==44993==AddressSanitizer: while reporting a bug found
> another one.Ignoring.
> [  DEATH   ]
> [  FAILED  ] AddressSanitizerMac.GCDDispatchAsync (743 ms)
>
> On Fri, Oct 18, 2013 at 8:37 PM, Alexander Potapenko <glider at google.com>
> wrote:
> > Either 192979 or 192980 broke the Mac build.
> >
> > On Fri, Oct 18, 2013 at 6:50 PM, Kostya Serebryany <kcc at google.com>
> wrote:
> >> Author: kcc
> >> Date: Fri Oct 18 09:50:44 2013
> >> New Revision: 192979
> >>
> >> URL: http://llvm.org/viewvc/llvm-project?rev=192979&view=rev
> >> Log:
> >> [asan] reduce the size of AsanThreadContext by storing the stack trace
> in the stack depot
> >>
> >> Modified:
> >>     compiler-rt/trunk/lib/asan/asan_report.cc
> >>     compiler-rt/trunk/lib/asan/asan_stack.cc
> >>     compiler-rt/trunk/lib/asan/asan_stack.h
> >>     compiler-rt/trunk/lib/asan/asan_thread.cc
> >>     compiler-rt/trunk/lib/asan/asan_thread.h
> >>
> >> Modified: compiler-rt/trunk/lib/asan/asan_report.cc
> >> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_report.cc?rev=192979&r1=192978&r2=192979&view=diff
> >>
> ==============================================================================
> >> --- compiler-rt/trunk/lib/asan/asan_report.cc (original)
> >> +++ compiler-rt/trunk/lib/asan/asan_report.cc Fri Oct 18 09:50:44 2013
> >> @@ -20,6 +20,7 @@
> >>  #include "sanitizer_common/sanitizer_common.h"
> >>  #include "sanitizer_common/sanitizer_flags.h"
> >>  #include "sanitizer_common/sanitizer_report_decorator.h"
> >> +#include "sanitizer_common/sanitizer_stackdepot.h"
> >>  #include "sanitizer_common/sanitizer_symbolizer.h"
> >>
> >>  namespace __asan {
> >> @@ -485,7 +486,9 @@ void DescribeThread(AsanThreadContext *c
> >>           context->parent_tid,
> >>           ThreadNameWithParenthesis(context->parent_tid,
> >>                                     tname, sizeof(tname)));
> >> -  PrintStack(&context->stack);
> >> +  uptr stack_size;
> >> +  const uptr *stack_trace = StackDepotGet(context->stack_id,
> &stack_size);
> >> +  PrintStack(stack_trace, stack_size);
> >>    // Recursively described parent thread if needed.
> >>    if (flags()->print_full_thread_history) {
> >>      AsanThreadContext *parent_context =
> >>
> >> Modified: compiler-rt/trunk/lib/asan/asan_stack.cc
> >> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_stack.cc?rev=192979&r1=192978&r2=192979&view=diff
> >>
> ==============================================================================
> >> --- compiler-rt/trunk/lib/asan/asan_stack.cc (original)
> >> +++ compiler-rt/trunk/lib/asan/asan_stack.cc Fri Oct 18 09:50:44 2013
> >> @@ -24,10 +24,13 @@ static bool MaybeCallAsanSymbolize(const
> >>                               : false;
> >>  }
> >>
> >> -void PrintStack(StackTrace *stack) {
> >> -  StackTrace::PrintStack(stack->trace, stack->size,
> common_flags()->symbolize,
> >> +void PrintStack(const uptr *trace, uptr size) {
> >> +  StackTrace::PrintStack(trace, size, common_flags()->symbolize,
> >>                           MaybeCallAsanSymbolize);
> >>  }
> >> +void PrintStack(StackTrace *stack) {
> >> +  PrintStack(stack->trace, stack->size);
> >> +}
> >>
> >>  }  // namespace __asan
> >>
> >>
> >> Modified: compiler-rt/trunk/lib/asan/asan_stack.h
> >> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_stack.h?rev=192979&r1=192978&r2=192979&view=diff
> >>
> ==============================================================================
> >> --- compiler-rt/trunk/lib/asan/asan_stack.h (original)
> >> +++ compiler-rt/trunk/lib/asan/asan_stack.h Fri Oct 18 09:50:44 2013
> >> @@ -22,6 +22,7 @@
> >>  namespace __asan {
> >>
> >>  void PrintStack(StackTrace *stack);
> >> +void PrintStack(const uptr *trace, uptr size);
> >>
> >>  }  // namespace __asan
> >>
> >>
> >> Modified: compiler-rt/trunk/lib/asan/asan_thread.cc
> >> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_thread.cc?rev=192979&r1=192978&r2=192979&view=diff
> >>
> ==============================================================================
> >> --- compiler-rt/trunk/lib/asan/asan_thread.cc (original)
> >> +++ compiler-rt/trunk/lib/asan/asan_thread.cc Fri Oct 18 09:50:44 2013
> >> @@ -19,6 +19,7 @@
> >>  #include "asan_mapping.h"
> >>  #include "sanitizer_common/sanitizer_common.h"
> >>  #include "sanitizer_common/sanitizer_placement_new.h"
> >> +#include "sanitizer_common/sanitizer_stackdepot.h"
> >>  #include "lsan/lsan_common.h"
> >>
> >>  namespace __asan {
> >> @@ -27,9 +28,8 @@ namespace __asan {
> >>
> >>  void AsanThreadContext::OnCreated(void *arg) {
> >>    CreateThreadContextArgs *args =
> static_cast<CreateThreadContextArgs*>(arg);
> >> -  if (args->stack) {
> >> -    internal_memcpy(&stack, args->stack, sizeof(stack));
> >> -  }
> >> +  if (args->stack)
> >> +    stack_id = StackDepotPut(args->stack->trace, args->stack->size);
> >>    thread = args->thread;
> >>    thread->set_context(this);
> >>  }
> >>
> >> Modified: compiler-rt/trunk/lib/asan/asan_thread.h
> >> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_thread.h?rev=192979&r1=192978&r2=192979&view=diff
> >>
> ==============================================================================
> >> --- compiler-rt/trunk/lib/asan/asan_thread.h (original)
> >> +++ compiler-rt/trunk/lib/asan/asan_thread.h Fri Oct 18 09:50:44 2013
> >> @@ -38,12 +38,12 @@ class AsanThreadContext : public ThreadC
> >>        : ThreadContextBase(tid),
> >>          announced(false),
> >>          destructor_iterations(kPthreadDestructorIterations),
> >> +        stack_id(0),
> >>          thread(0) {
> >> -    internal_memset(&stack, 0, sizeof(stack));
> >>    }
> >>    bool announced;
> >> -  int destructor_iterations;
> >> -  StackTrace stack;
> >> +  u8 destructor_iterations;
> >> +  u32 stack_id;
> >>    AsanThread *thread;
> >>
> >>    void OnCreated(void *arg);
> >> @@ -51,7 +51,7 @@ class AsanThreadContext : public ThreadC
> >>  };
> >>
> >>  // AsanThreadContext objects are never freed, so we need many of them.
> >> -COMPILER_CHECK(sizeof(AsanThreadContext) <= 4096);
> >> +COMPILER_CHECK(sizeof(AsanThreadContext) <= 256);
> >>
> >>  // AsanThread are stored in TSD and destroyed when the thread dies.
> >>  class AsanThread {
> >>
> >>
> >> _______________________________________________
> >> llvm-commits mailing list
> >> llvm-commits at cs.uiuc.edu
> >> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> >
> >
> >
> > --
> > Alexander Potapenko
> > Software Engineer
> > Google Moscow
>
>
>
> --
> Alexander Potapenko
> Software Engineer
> Google Moscow
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20131018/dc9864bc/attachment.html>


More information about the llvm-commits mailing list