<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>