<div dir="ltr">Otherwise lgtm.</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Sep 11, 2013 at 3:57 PM, Sergey Matveev <span dir="ltr"><<a href="mailto:earthdok@google.com" target="_blank">earthdok@google.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Stacktrace is not a verb. Can we please call it "isUnwindingStack" etc?<div><br></div><div>I will take a closer look at the code later today.</div>
</div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><br><div class="gmail_quote">
On Wed, Sep 11, 2013 at 3:13 PM, Evgeniy Stepanov <span dir="ltr"><<a href="mailto:eugeni.stepanov@gmail.com" target="_blank">eugeni.stepanov@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

Now we've got some allocations without stack traces, and it makes LSan sad.<br>
<br>
One of those is from after the AsanThread object is destroyed:<br>
<br>
#2  0x000000000044593f in __interceptor_malloc () at<br>
../projects/compiler-rt/lib/asan/asan_malloc_linux.cc:74<br>
#3  0x0000000000459fc6 in key_destructor (arg=<optimized out>)<br>
    at /code/llvm2/projects/compiler-rt/lib/lsan/lit_tests/TestCases/disabler_in_tsd_destructor.cc:17<br>
#4  0x00007ffff7bc4c83 in __nptl_deallocate_tsd () at pthread_create.c:156<br>
#5  0x00007ffff7bc4ea8 in start_thread (arg=0x7ffff2fff700) at<br>
pthread_create.c:315<br>
#6  0x00007ffff6cd3ccd in clone () at<br>
../sysdeps/unix/sysv/linux/x86_64/clone.S:112<br>
<br>
Attached patch makes LSan consider any such allocation reachable.<br>
I'll wait for Sergey to comment on this.<br>
<br>
<br>
On Wed, Sep 11, 2013 at 5:42 AM, 林作健 <<a href="mailto:manjian2006@gmail.com" target="_blank">manjian2006@gmail.com</a>> wrote:<br>
> Please review it.<br>
><br>
><br>
> Index: lib/asan/asan_thread.h<br>
> ===================================================================<br>
> --- lib/asan/asan_thread.h (revision 190475)<br>
> +++ lib/asan/asan_thread.h (working copy)<br>
> @@ -86,12 +86,19 @@<br>
<div>>      UnmapOrDie(fake_stack_, sizeof(FakeStack));<br>
>    }<br>
>    FakeStack *fake_stack() { return fake_stack_; }<br>
</div>> +  bool isStacktracing() const {<br>
> +    return stacktracing;<br>
> +  }<br>
> +  void setStacktracing(bool b) {<br>
> +    stacktracing = b;<br>
<div>> +  }<br>
><br>
>    AsanThreadLocalMallocStorage &malloc_storage() { return malloc_storage_;<br>
> }<br>
>    AsanStats &stats() { return stats_; }<br>
><br>
</div>>   private:<br>
> -  AsanThread() {}<br>
> +  AsanThread()<br>
> +       : stacktracing(false) {}<br>
>    void SetThreadStackAndTls();<br>
>    void ClearShadowForThreadStackAndTLS();<br>
>    AsanThreadContext *context_;<br>
> @@ -105,8 +112,23 @@<br>
>    FakeStack *fake_stack_;<br>
>    AsanThreadLocalMallocStorage malloc_storage_;<br>
>    AsanStats stats_;<br>
> +  bool stacktracing;<br>
>  };<br>
><br>
> +// ScopedStacktracing is a scope for stacktracing member of a context<br>
> +class ScopedStacktracing {<br>
> +  public:<br>
> +    ScopedStacktracing (AsanThread * t)<br>
> +      : thread(t) {<br>
> +        t->setStacktracing(true);<br>
> +    }<br>
> +    ~ScopedStacktracing() {<br>
> +      thread->setStacktracing(false);<br>
<div>> +    }<br>
> +  private:<br>
> +    AsanThread * thread;<br>
> +};<br>
> +<br>
>  struct CreateThreadContextArgs {<br>
>    AsanThread *thread;<br>
>    StackTrace *stack;<br>
> Index: lib/asan/asan_stack.h<br>
> ===================================================================<br>
</div>> --- lib/asan/asan_stack.h (revision 190475)<br>
<div>> +++ lib/asan/asan_stack.h (working copy)<br>
> @@ -36,14 +36,16 @@<br>
>  #define GET_STACK_TRACE_WITH_PC_AND_BP(max_s, pc, bp, fast)     \<br>
>    StackTrace stack;                                             \<br>
>    {                                                             \<br>
> -    uptr stack_top = 0, stack_bottom = 0;                       \<br>
>      AsanThread *t;                                              \<br>
> -    if (asan_inited && (t = GetCurrentThread())) {              \<br>
> -      stack_top = t->stack_top();                               \<br>
> -      stack_bottom = t->stack_bottom();                         \<br>
> +    stack.size = 0;                                             \<br>
> +    if (asan_inited && (t = GetCurrentThread())                 \<br>
> +        && !t->isStacktracing()) {                              \<br>
> +      uptr stack_top = t->stack_top();                          \<br>
> +      uptr stack_bottom = t->stack_bottom();                    \<br>
</div>> +      ScopedStacktracing sink(t);                               \<br>
<div>> +      GetStackTrace(&stack, max_s, pc, bp,                      \<br>
> +                    stack_top, stack_bottom, fast);             \<br>
>      }                                                           \<br>
> -    GetStackTrace(&stack, max_s, pc, bp,                        \<br>
> -                  stack_top, stack_bottom, fast);               \<br>
>    }<br>
>  #endif  // SANITIZER_WINDOWS<br>
><br>
><br>
><br>
><br>
</div><div><div>> 2013/9/10 Evgeniy Stepanov <<a href="mailto:eugeni.stepanov@gmail.com" target="_blank">eugeni.stepanov@gmail.com</a>><br>
>><br>
>> On Mon, Sep 9, 2013 at 2:09 PM, 林作健 <<a href="mailto:manjian2006@gmail.com" target="_blank">manjian2006@gmail.com</a>> wrote:<br>
>> > Index: lib/asan/asan_thread.h<br>
>> > ===================================================================<br>
>> > --- lib/asan/asan_thread.h (revision 190121)<br>
>> > +++ lib/asan/asan_thread.h (working copy)<br>
>> > @@ -36,10 +36,12 @@<br>
>> >    explicit AsanThreadContext(int tid)<br>
>> >        : ThreadContextBase(tid),<br>
>> >          announced(false),<br>
>> > +        stacktracing(false),<br>
>> >          thread(0) {<br>
>> >      internal_memset(&stack, 0, sizeof(stack));<br>
>> >    }<br>
>> >    bool announced;<br>
>> > +  bool stacktracing;<br>
>><br>
>> Thread context objects live forever. Please move this to AsanThread.<br>
>><br>
>> >    StackTrace stack;<br>
>> >    AsanThread *thread;<br>
>> ><br>
>> > @@ -86,6 +88,12 @@<br>
>> >      UnmapOrDie(fake_stack_, sizeof(FakeStack));<br>
>> >    }<br>
>> >    FakeStack *fake_stack() { return fake_stack_; }<br>
>> > +  bool isStacktracing() {<br>
>> > +    if (context()) {<br>
>> > +      return context()->stacktracing;<br>
>> > +    }<br>
>> > +    return false;<br>
>> > +  }<br>
>> ><br>
>> >    AsanThreadLocalMallocStorage &malloc_storage() { return<br>
>> > malloc_storage_;<br>
>> > }<br>
>> >    AsanStats &stats() { return stats_; }<br>
>> > @@ -107,6 +115,24 @@<br>
>> >    AsanStats stats_;<br>
>> >  };<br>
>> ><br>
>> > +// AsanStacktracingSink is a sink for stacktracing member of a context<br>
>> > +class AsanStacktracingSink {<br>
>><br>
>> Please call it ScopedSomething. M/b ScopedInStackTrace or<br>
>> ScopedStacktracing.<br>
>><br>
>> > +  public:<br>
>> > +    AsanStacktracingSink(AsanThread * t)<br>
>> > +      : thread(t) {<br>
>> > +      if(t->context()) {<br>
>> > +        t->context()->stacktracing = true;<br>
>> > +      }<br>
>> > +    }<br>
>> > +    ~AsanStacktracingSink() {<br>
>> > +      if(thread->context()) {<br>
>> > +        thread->context()->stacktracing = false;<br>
>> > +      }<br>
>> > +    }<br>
>> > +  private:<br>
>> > +    AsanThread * thread;<br>
>> > +};<br>
>> > +<br>
>> >  struct CreateThreadContextArgs {<br>
>> >    AsanThread *thread;<br>
>> >    StackTrace *stack;<br>
>> > Index: lib/asan/asan_stack.h<br>
>> > ===================================================================<br>
>> > --- lib/asan/asan_stack.h (revision 190121)<br>
>> > +++ lib/asan/asan_stack.h (working copy)<br>
>> > @@ -36,14 +36,16 @@<br>
>> >  #define GET_STACK_TRACE_WITH_PC_AND_BP(max_s, pc, bp, fast)     \<br>
>> >    StackTrace stack;                                             \<br>
>> >    {                                                             \<br>
>> > -    uptr stack_top = 0, stack_bottom = 0;                       \<br>
>> >      AsanThread *t;                                              \<br>
>> > -    if (asan_inited && (t = GetCurrentThread())) {              \<br>
>> > -      stack_top = t->stack_top();                               \<br>
>> > -      stack_bottom = t->stack_bottom();                         \<br>
>> > +    stack.size = 0;                                             \<br>
>> > +    if (asan_inited && (t = GetCurrentThread())                 \<br>
>> > +        && !t->isStacktracing()) {                              \<br>
>> > +      uptr stack_top = t->stack_top();                          \<br>
>> > +      uptr stack_bottom = t->stack_bottom();                    \<br>
>> > +      AsanStacktracingSink sink(t);                             \<br>
>> > +      GetStackTrace(&stack, max_s, pc, bp,                      \<br>
>> > +                    stack_top, stack_bottom, fast);             \<br>
>> >      }                                                           \<br>
>> > -    GetStackTrace(&stack, max_s, pc, bp,                        \<br>
>> > -                  stack_top, stack_bottom, fast);               \<br>
>> >    }<br>
>> >  #endif  // SANITIZER_WINDOWS<br>
>> ><br>
>> ><br>
>> > _______________________________________________<br>
>> > llvm-commits mailing list<br>
>> > <a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
>> > <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
>> ><br>
><br>
><br>
</div></div></blockquote></div><br></div>
</div></div></blockquote></div><br></div>