<div dir="ltr"><div class="gmail_extra">I don't think this is a good change as-is. Please follow-up with the code review fixing the issues pointed below.</div><div class="gmail_extra"><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Sep 11, 2015 at 6:55 AM, Adhemerval Zanella via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Author: azanella<br>
Date: Fri Sep 11 08:55:00 2015<br>
New Revision: 247413<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=247413&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=247413&view=rev</a><br>
Log:<br>
[compiler-rt] [sanitizers] Add VMA size check at runtime<br>
<br>
This patch adds a runtime check for asan, dfsan, msan, and tsan for<br>
architectures that support multiple VMA size (like aarch64).  Currently<br>
the check only prints a warning indicating which is the VMA built and<br>
expected against the one detected at runtime.<br>
<br>
<br>
Modified:<br>
    compiler-rt/trunk/lib/asan/asan_rtl.cc<br>
    compiler-rt/trunk/lib/dfsan/dfsan.cc<br>
    compiler-rt/trunk/lib/msan/msan.cc<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_win.cc<br>
    compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc<br>
<br>
Modified: compiler-rt/trunk/lib/asan/asan_rtl.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_rtl.cc?rev=247413&r1=247412&r2=247413&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_rtl.cc?rev=247413&r1=247412&r2=247413&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/asan/asan_rtl.cc (original)<br>
+++ compiler-rt/trunk/lib/asan/asan_rtl.cc Fri Sep 11 08:55:00 2015<br>
@@ -585,6 +585,7 @@ void NOINLINE __asan_set_death_callback(<br>
 // Initialize as requested from instrumented application code.<br>
 // We use this call as a trigger to wake up ASan from deactivated state.<br>
 void __asan_init() {<br>
+  CheckVMASize();<br></blockquote><div><br></div><div>Hm? I feel that this is far too early - the runtime is not properly initialized at this point yet. I believe you have to find a different place</div><div>for CheckVMASize() call. It should at least be after the runtime flags initialization in AsanInitInternal() - for example where we call</div><div><br></div><div><div>  AsanCheckIncompatibleRT();</div><div>  AsanCheckDynamicRTPrereqs();</div></div><div><br></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
   AsanActivate();<br>
   AsanInitInternal();<br>
 }<br>
<br>
Modified: compiler-rt/trunk/lib/dfsan/dfsan.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/dfsan/dfsan.cc?rev=247413&r1=247412&r2=247413&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/dfsan/dfsan.cc?rev=247413&r1=247412&r2=247413&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/dfsan/dfsan.cc (original)<br>
+++ compiler-rt/trunk/lib/dfsan/dfsan.cc Fri Sep 11 08:55:00 2015<br>
@@ -399,6 +399,8 @@ static void dfsan_fini() {<br>
 }<br>
<br>
 static void dfsan_init(int argc, char **argv, char **envp) {<br>
+  CheckVMASize();<br>
+<br>
   MmapFixedNoReserve(kShadowAddr, kUnusedAddr - kShadowAddr);<br></blockquote><div><br></div><div><br></div><div>Same here. Please parse the flags first. If you want to prevent calling Mmap() without checking VMA first, move</div><div>the InitializeFlags() call up (this would be the correct change).</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
   // Protect the region of memory we don't use, to preserve the one-to-one<br>
<br>
Modified: compiler-rt/trunk/lib/msan/msan.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/msan/msan.cc?rev=247413&r1=247412&r2=247413&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/msan/msan.cc?rev=247413&r1=247412&r2=247413&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/msan/msan.cc (original)<br>
+++ compiler-rt/trunk/lib/msan/msan.cc Fri Sep 11 08:55:00 2015<br>
@@ -375,6 +375,8 @@ void __msan_init() {<br>
   msan_init_is_running = 1;<br>
   SanitizerToolName = "MemorySanitizer";<br>
<br>
+  CheckVMASize();<br>
+<br></blockquote><div><br></div><div>Same here.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
   InitTlsSize();<br>
<br>
   CacheBinaryName();<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h?rev=247413&r1=247412&r2=247413&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h?rev=247413&r1=247412&r2=247413&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h Fri Sep 11 08:55:00 2015<br>
@@ -97,6 +97,8 @@ void DecreaseTotalMmap(uptr size);<br>
 uptr GetRSS();<br>
 void NoHugePagesInRegion(uptr addr, uptr length);<br>
 void DontDumpShadowMemory(uptr addr, uptr length);<br>
+// Check if the built VMA size matches the runtime one.<br>
+void CheckVMASize();<br></blockquote><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
 // InternalScopedBuffer can be used instead of large stack arrays to<br>
 // keep frame size low.<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc?rev=247413&r1=247412&r2=247413&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc?rev=247413&r1=247412&r2=247413&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc Fri Sep 11 08:55:00 2015<br>
@@ -324,6 +324,22 @@ SignalContext SignalContext::Create(void<br>
   return SignalContext(context, addr, pc, sp, bp);<br>
 }<br>
<br>
+// This function check is the built VMA matches the runtime one for<br>
+// architectures with multiple VMA size.<br>
+void CheckVMASize() {<br>
+#ifdef __aarch64__<br>
+  static const unsigned kBuiltVMA = SANITIZER_AARCH64_VMA;<br>
+  unsigned maxRuntimeVMA =<br>
+    (MostSignificantSetBitIndex(GET_CURRENT_FRAME()) + 1);<br>
+  if (kBuiltVMA != maxRuntimeVMA) {<br>
+    Printf("WARNING: %s runtime VMA is not the one built for.\n",<br>
+      SanitizerToolName);<br>
+    Printf("\tBuilt VMA:   %u bits\n", kBuiltVMA);<br>
+    Printf("\tRuntime VMA: %u bits\n", maxRuntimeVMA);<br>
+  }<br>
+#endif<br>
+}<br></blockquote><div><br></div><div>Can the program proceed with invalid VMA? Or it's better to just kill it in this case?</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
+<br>
 }  // namespace __sanitizer<br>
<br>
 #endif  // SANITIZER_POSIX<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_win.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_win.cc?rev=247413&r1=247412&r2=247413&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_win.cc?rev=247413&r1=247412&r2=247413&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_win.cc (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_win.cc Fri Sep 11 08:55:00 2015<br>
@@ -755,6 +755,10 @@ uptr ReadLongProcessName(/*out*/char *bu<br>
   return ReadBinaryName(buf, buf_len);<br>
 }<br>
<br>
+void CheckVMASize() {<br>
+  // Do nothing.<br>
+}<br>
+<br>
 }  // namespace __sanitizer<br>
<br>
 #endif  // _WIN32<br>
<br>
Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc?rev=247413&r1=247412&r2=247413&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc?rev=247413&r1=247412&r2=247413&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc (original)<br>
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc Fri Sep 11 08:55:00 2015<br>
@@ -312,6 +312,9 @@ void Initialize(ThreadState *thr) {<br>
   if (is_initialized)<br>
     return;<br>
   is_initialized = true;<br>
+<br>
+  CheckVMASize();<br></blockquote><div><br></div><div><br></div><div>Same here.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
+<br>
   // We are not ready to handle interceptors yet.<br>
   ScopedIgnoreInterceptors ignore;<br>
   SanitizerToolName = "ThreadSanitizer";<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr">Alexey Samsonov<br><a href="mailto:vonosmas@gmail.com" target="_blank">vonosmas@gmail.com</a></div></div>
</div></div>