<div dir="ltr"><br><div class="gmail_extra"><div class="gmail_quote">On Fri, Sep 27, 2013 at 9:14 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">Shouldn't we treat them as live roots, then? I believe this belongs in ProcessPlatformSpecificAllocations, not here.</div>
</blockquote><div><br></div><div>Makes sense. r191662.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5"><div class="gmail_extra">
<br><br><div class="gmail_quote">On Fri, Sep 27, 2013 at 5:54 PM, Alexey Samsonov <span dir="ltr"><<a href="mailto:samsonov@google.com" target="_blank">samsonov@google.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: samsonov<br>
Date: Fri Sep 27 08:54:20 2013<br>
New Revision: 191522<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=191522&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=191522&view=rev</a><br>
Log:<br>
[LSan] Don't report leaks with single-frame stack traces<br>
<br>
Added:<br>
    compiler-rt/trunk/lib/lsan/lit_tests/TestCases/swapcontext.cc<br>
Modified:<br>
    compiler-rt/trunk/lib/lsan/lsan_common.cc<br>
<br>
Added: compiler-rt/trunk/lib/lsan/lit_tests/TestCases/swapcontext.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/lsan/lit_tests/TestCases/swapcontext.cc?rev=191522&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/lsan/lit_tests/TestCases/swapcontext.cc?rev=191522&view=auto</a><br>


==============================================================================<br>
--- compiler-rt/trunk/lib/lsan/lit_tests/TestCases/swapcontext.cc (added)<br>
+++ compiler-rt/trunk/lib/lsan/lit_tests/TestCases/swapcontext.cc Fri Sep 27 08:54:20 2013<br>
@@ -0,0 +1,42 @@<br>
+// We can't unwind stack if we're running coroutines on heap-allocated<br>
+// memory. Make sure we don't report these leaks.<br>
+<br>
+// RUN: %clangxx_lsan %s -o %t<br>
+// RUN: %t 2>&1<br>
+// RUN: not %t foo 2>&1 | FileCheck %s<br>
+<br>
+#include <stdio.h><br>
+#include <ucontext.h><br>
+#include <unistd.h><br>
+<br>
+const int kStackSize = 1 << 20;<br>
+<br>
+void Child() {<br>
+  int child_stack;<br>
+  printf("Child: %p\n", &child_stack);<br>
+  int *leaked = new int[666];<br>
+}<br>
+<br>
+int main(int argc, char *argv[]) {<br>
+  char stack_memory[kStackSize + 1];<br>
+  char *heap_memory = new char[kStackSize + 1];<br>
+  char *child_stack = (argc > 1) ? stack_memory : heap_memory;<br>
+<br>
+  printf("Child stack: %p\n", child_stack);<br>
+  ucontext_t orig_context;<br>
+  ucontext_t child_context;<br>
+  getcontext(&child_context);<br>
+  child_context.uc_stack.ss_sp = child_stack;<br>
+  child_context.uc_stack.ss_size = kStackSize / 2;<br>
+  child_context.uc_link = &orig_context;<br>
+  makecontext(&child_context, Child, 0);<br>
+  if (swapcontext(&orig_context, &child_context) < 0) {<br>
+    perror("swapcontext");<br>
+    return 1;<br>
+  }<br>
+<br>
+  delete[] heap_memory;<br>
+  return 0;<br>
+}<br>
+<br>
+// CHECK: SUMMARY: LeakSanitizer: 2664 byte(s) leaked in 1 allocation(s)<br>
<br>
Modified: compiler-rt/trunk/lib/lsan/lsan_common.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/lsan/lsan_common.cc?rev=191522&r1=191521&r2=191522&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/lsan/lsan_common.cc?rev=191522&r1=191521&r2=191522&view=diff</a><br>


==============================================================================<br>
--- compiler-rt/trunk/lib/lsan/lsan_common.cc (original)<br>
+++ compiler-rt/trunk/lib/lsan/lsan_common.cc Fri Sep 27 08:54:20 2013<br>
@@ -295,10 +295,14 @@ static void CollectLeaksCb(uptr chunk, v<br>
   LsanMetadata m(chunk);<br>
   if (!m.allocated()) return;<br>
   if (m.tag() == kDirectlyLeaked || m.tag() == kIndirectlyLeaked) {<br>
+    uptr size = 0;<br>
+    const uptr *trace = StackDepotGet(m.stack_trace_id(), &size);<br>
+    // Ignore leaks with one-frame stack traces (which often come from<br>
+    // coroutines) - they are not actionable.<br>
+    if (size <= 1)<br>
+      return;<br>
     uptr resolution = flags()->resolution;<br>
     if (resolution > 0) {<br>
-      uptr size = 0;<br>
-      const uptr *trace = StackDepotGet(m.stack_trace_id(), &size);<br>
       size = Min(size, resolution);<br>
       leak_report->Add(StackDepotPut(trace, size), m.requested_size(), m.tag());<br>
     } else {<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>
</blockquote></div><br></div>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div>Alexey Samsonov, MSK</div>
</div></div>