<div dir="ltr">This test fails for me locally. Please check if r208356 fixes it properly.</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, May 8, 2014 at 9:09 AM, 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">Author: smatveev<br>
Date: Thu May  8 11:09:54 2014<br>
New Revision: 208333<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=208333&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=208333&view=rev</a><br>
Log:<br>
[ASan] Fix coverage behavior when a PC belongs to an unknown address range.<br>
<br>
This happens, e.g., when coverage data is collected for a module which is then<br>
dlclose()'d. Currently this causes CovDump() to ignore all PCs that are greater<br>
than the unrecognized PC. In other words, unloading a module causes ASan to<br>
silently ignore any coverage data for modules loaded at higher addresses.<br>
Instead we should just skip the unrecognized PCs.<br>
<br>
Added:<br>
    compiler-rt/trunk/test/asan/TestCases/Linux/coverage-module-unloaded.cc<br>
Modified:<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_coverage.cc<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_coverage.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_coverage.cc?rev=208333&r1=208332&r2=208333&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_coverage.cc?rev=208333&r1=208332&r2=208333&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_coverage.cc (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_coverage.cc Thu May  8 11:09:54 2014<br>
@@ -90,8 +90,9 @@ void CovDump() {<br>
        i++) {<br>
     if ((prot & MemoryMappingLayout::kProtectionExecute) == 0)<br>
       continue;<br>
+    while (vb < ve && *vb < mb) vb++;<br>
     if (vb >= ve) break;<br>
-    if (mb <= *vb && *vb < me) {<br>
+    if (*vb < me) {<br>
       offsets.clear();<br>
       const uptr *old_vb = vb;<br>
       CHECK_LE(off, *vb);<br>
<br>
Added: compiler-rt/trunk/test/asan/TestCases/Linux/coverage-module-unloaded.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/TestCases/Linux/coverage-module-unloaded.cc?rev=208333&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/TestCases/Linux/coverage-module-unloaded.cc?rev=208333&view=auto</a><br>

==============================================================================<br>
--- compiler-rt/trunk/test/asan/TestCases/Linux/coverage-module-unloaded.cc (added)<br>
+++ compiler-rt/trunk/test/asan/TestCases/Linux/coverage-module-unloaded.cc Thu May  8 11:09:54 2014<br>
@@ -0,0 +1,55 @@<br>
+// Check that unloading a module doesn't break coverage dumping for remaining<br>
+// modules.<br>
+// RUN: %clangxx_asan -mllvm -asan-coverage=1 -DSHARED %s -shared -o %T/libcoverage_module_unloaded_test_1.so -fPIC<br>
+// RUN: %clangxx_asan -mllvm -asan-coverage=1 -DSHARED %s -shared -o %T/libcoverage_module_unloaded_test_2.so -fPIC<br>
+// RUN: %clangxx_asan -mllvm -asan-coverage=1 -DSO_DIR=\"%T\" %s -o %t -Wl,-R,\$ORIGIN -L%T -lcoverage_test<br>
+// RUN: export ASAN_OPTIONS=coverage=1:verbosity=1<br>
+// RUN: %t 2>&1         | FileCheck %s<br>
+// RUN: %t foo 2>&1         | FileCheck %s<br>
+//<br>
+// <a href="https://code.google.com/p/address-sanitizer/issues/detail?id=263" target="_blank">https://code.google.com/p/address-sanitizer/issues/detail?id=263</a><br>
+// XFAIL: android<br>
+<br>
+#include <assert.h><br>
+#include <dlfcn.h><br>
+#include <stdio.h><br>
+#include <unistd.h><br>
+<br>
+#ifdef SHARED<br>
+extern "C" {<br>
+void bar() { printf("bar\n"); }<br>
+}<br>
+#else<br>
+<br>
+int main(int argc, char **argv) {<br>
+  fprintf(stderr, "PID: %d\n", getpid());<br>
+  fprintf(stderr, "Opening %s\n", SO_DIR "/libcoverage_module_disappeared_test_1.so");<br>
+  void *handle1 =<br>
+      dlopen(SO_DIR "/libcoverage_module_disappeared_test_1.so", RTLD_LAZY);<br>
+  assert(handle1);<br>
+  void (*bar1)() = (void (*)())dlsym(handle1, "bar");<br>
+  assert(bar1);<br>
+  bar1();<br>
+  void *handle2 =<br>
+      dlopen(SO_DIR "/libcoverage_module_disappeared_test_2.so", RTLD_LAZY);<br>
+  assert(handle2);<br>
+  void (*bar2)() = (void (*)())dlsym(handle2, "bar");<br>
+  assert(bar2);<br>
+  bar2();<br>
+<br>
+  // It matters whether the unloaded module has a higher or lower address range<br>
+  // than the remaining one. Make sure to test both cases.<br>
+  if (argc < 2)<br>
+    dlclose(bar1 < bar2 ? handle1 : handle2);<br>
+  else<br>
+    dlclose(bar1 < bar2 ? handle2 : handle1);<br>
+  return 0;<br>
+}<br>
+#endif<br>
+<br>
+// CHECK: PID: [[PID:[0-9]+]]<br>
+// CHECK: [[PID]].sancov: 1 PCs written<br>
+// CHECK: .so.[[PID]]<br>
+// If we get coverage for both DSOs, it means the module wasn't unloaded and<br>
+// this test is useless.<br>
+// CHECK-not: .so.[[PID]]<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">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><br clear="all"><div><br></div>-- <br><div dir="ltr"><div>Alexey Samsonov, Mountain View, CA</div></div>
</div>