<div dir="ltr">I'm not sure I like this. This means that we can initialize ASan using the flag values from ASAN_OPTIONS, then override them with the values from LSAN_OPTIONS and keep running with the new values. I'm pretty sure some of our code assumes that the flags don't change after initialization.</div>
<div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Aug 19, 2014 at 3:39 AM, Alexey Samsonov <span dir="ltr"><<a href="mailto:vonosmas@gmail.com" target="_blank">vonosmas@gmail.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: Mon Aug 18 18:39:47 2014<br>
New Revision: 215949<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=215949&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=215949&view=rev</a><br>
Log:<br>
[LSan] Parse common flags from LSAN_OPTIONS even if LSan is combined with<br>
another sanitizer.<br>
<br>
A user may run both LSan and LSan+ASan. It is weird to pass path to leak<br>
suppression file (or other common sanitizer flags, like "verbosity") in<br>
"LSAN_OPTIONS" in the first case and in "ASAN_OPTIONS" in the second case.<br>
<br>
<br>
Modified:<br>
    compiler-rt/trunk/lib/asan/asan_rtl.cc<br>
    compiler-rt/trunk/lib/lsan/lsan.cc<br>
    compiler-rt/trunk/lib/lsan/lsan_common.cc<br>
    compiler-rt/trunk/lib/lsan/lsan_common.h<br>
    compiler-rt/trunk/test/lsan/TestCases/ignore_object.cc<br>
    compiler-rt/trunk/test/lsan/TestCases/ignore_object_errors.cc<br>
    compiler-rt/trunk/test/lsan/TestCases/leak_check_at_exit.cc<br>
    compiler-rt/trunk/test/lsan/TestCases/print_suppressions.cc<br>
    compiler-rt/trunk/test/lsan/TestCases/suppressions_file.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=215949&r1=215948&r2=215949&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_rtl.cc?rev=215949&r1=215948&r2=215949&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/asan/asan_rtl.cc (original)<br>
+++ compiler-rt/trunk/lib/asan/asan_rtl.cc Mon Aug 18 18:39:47 2014<br>
@@ -680,7 +680,7 @@ static void AsanInitInternal() {<br>
   SanitizerInitializeUnwinder();<br>
<br>
 #if CAN_SANITIZE_LEAKS<br>
-  __lsan::InitCommonLsan();<br>
+  __lsan::InitCommonLsan(false);<br>
   if (common_flags()->detect_leaks && common_flags()->leak_check_at_exit) {<br>
     Atexit(__lsan::DoLeakCheck);<br>
   }<br>
<br>
Modified: compiler-rt/trunk/lib/lsan/lsan.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/lsan/lsan.cc?rev=215949&r1=215948&r2=215949&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/lsan/lsan.cc?rev=215949&r1=215948&r2=215949&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/lsan/lsan.cc (original)<br>
+++ compiler-rt/trunk/lib/lsan/lsan.cc Mon Aug 18 18:39:47 2014<br>
@@ -25,16 +25,6 @@ bool lsan_init_is_running;<br>
<br>
 namespace __lsan {<br>
<br>
-static void InitializeCommonFlags() {<br>
-  CommonFlags *cf = common_flags();<br>
-  SetCommonFlagsDefaults(cf);<br>
-  cf->external_symbolizer_path = GetEnv("LSAN_SYMBOLIZER_PATH");<br>
-  cf->malloc_context_size = 30;<br>
-  cf->detect_leaks = true;<br>
-<br>
-  ParseCommonFlagsFromString(cf, GetEnv("LSAN_OPTIONS"));<br>
-}<br>
-<br>
 ///// Interface to the common LSan module. /////<br>
 bool WordIsPoisoned(uptr addr) {<br>
   return false;<br>
@@ -50,7 +40,7 @@ extern "C" void __lsan_init() {<br>
     return;<br>
   lsan_init_is_running = true;<br>
   SanitizerToolName = "LeakSanitizer";<br>
-  InitializeCommonFlags();<br>
+  InitCommonLsan(true);<br>
   InitializeAllocator();<br>
   InitTlsSize();<br>
   InitializeInterceptors();<br>
@@ -62,7 +52,6 @@ extern "C" void __lsan_init() {<br>
<br>
   Symbolizer::GetOrInit();<br>
<br>
-  InitCommonLsan();<br>
   if (common_flags()->detect_leaks && common_flags()->leak_check_at_exit)<br>
     Atexit(DoLeakCheck);<br>
   lsan_inited = true;<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=215949&r1=215948&r2=215949&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/lsan/lsan_common.cc?rev=215949&r1=215948&r2=215949&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/lsan/lsan_common.cc (original)<br>
+++ compiler-rt/trunk/lib/lsan/lsan_common.cc Mon Aug 18 18:39:47 2014<br>
@@ -36,7 +36,7 @@ bool DisabledInThisThread() { return dis<br>
<br>
 Flags lsan_flags;<br>
<br>
-static void InitializeFlags() {<br>
+static void InitializeFlags(bool standalone) {<br>
   Flags *f = flags();<br>
   // Default values.<br>
   f->report_objects = false;<br>
@@ -71,6 +71,17 @@ static void InitializeFlags() {<br>
     ParseFlag(options, &f->log_threads, "log_threads", "");<br>
     ParseFlag(options, &f->exitcode, "exitcode", "");<br>
   }<br>
+<br>
+  // Set defaults for common flags (only in standalone mode) and parse<br>
+  // them from LSAN_OPTIONS.<br>
+  CommonFlags *cf = common_flags();<br>
+  if (standalone) {<br>
+    SetCommonFlagsDefaults(cf);<br>
+    cf->external_symbolizer_path = GetEnv("LSAN_SYMBOLIZER_PATH");<br>
+    cf->malloc_context_size = 30;<br>
+    cf->detect_leaks = true;<br>
+  }<br>
+  ParseCommonFlagsFromString(cf, options);<br>
 }<br>
<br>
 #define LOG_POINTERS(...)                           \<br>
@@ -106,8 +117,8 @@ void InitializeRootRegions() {<br>
   root_regions = new(placeholder) InternalMmapVector<RootRegion>(1);<br>
 }<br>
<br>
-void InitCommonLsan() {<br>
-  InitializeFlags();<br>
+void InitCommonLsan(bool standalone) {<br>
+  InitializeFlags(standalone);<br>
   InitializeRootRegions();<br>
   if (common_flags()->detect_leaks) {<br>
     // Initialization which can fail or print warnings should only be done if<br>
<br>
Modified: compiler-rt/trunk/lib/lsan/lsan_common.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/lsan/lsan_common.h?rev=215949&r1=215948&r2=215949&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/lsan/lsan_common.h?rev=215949&r1=215948&r2=215949&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/lsan/lsan_common.h (original)<br>
+++ compiler-rt/trunk/lib/lsan/lsan_common.h Mon Aug 18 18:39:47 2014<br>
@@ -131,7 +131,7 @@ enum IgnoreObjectResult {<br>
 };<br>
<br>
 // Functions called from the parent tool.<br>
-void InitCommonLsan();<br>
+void InitCommonLsan(bool standalone);<br>
 void DoLeakCheck();<br>
 bool DisabledInThisThread();<br>
<br>
<br>
Modified: compiler-rt/trunk/test/lsan/TestCases/ignore_object.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/lsan/TestCases/ignore_object.cc?rev=215949&r1=215948&r2=215949&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/lsan/TestCases/ignore_object.cc?rev=215949&r1=215948&r2=215949&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/test/lsan/TestCases/ignore_object.cc (original)<br>
+++ compiler-rt/trunk/test/lsan/TestCases/ignore_object.cc Mon Aug 18 18:39:47 2014<br>
@@ -1,7 +1,7 @@<br>
 // Test for __lsan_ignore_object().<br>
 // RUN: LSAN_BASE="report_objects=1:use_registers=0:use_stacks=0:use_globals=0:use_tls=0:verbosity=2"<br>
 // RUN: %clangxx_lsan %s -o %t<br>
-// RUN: LSAN_OPTIONS=$LSAN_BASE ASAN_OPTIONS=$ASAN_OPTIONS:"verbosity=2" not %run %t 2>&1 | FileCheck %s<br>
+// RUN: LSAN_OPTIONS=$LSAN_BASE not %run %t 2>&1 | FileCheck %s<br>
<br>
 #include <stdio.h><br>
 #include <stdlib.h><br>
<br>
Modified: compiler-rt/trunk/test/lsan/TestCases/ignore_object_errors.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/lsan/TestCases/ignore_object_errors.cc?rev=215949&r1=215948&r2=215949&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/lsan/TestCases/ignore_object_errors.cc?rev=215949&r1=215948&r2=215949&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/test/lsan/TestCases/ignore_object_errors.cc (original)<br>
+++ compiler-rt/trunk/test/lsan/TestCases/ignore_object_errors.cc Mon Aug 18 18:39:47 2014<br>
@@ -1,7 +1,7 @@<br>
 // Test for incorrect use of __lsan_ignore_object().<br>
 // RUN: LSAN_BASE="verbosity=2"<br>
 // RUN: %clangxx_lsan %s -o %t<br>
-// RUN: LSAN_OPTIONS=$LSAN_BASE ASAN_OPTIONS=$ASAN_OPTIONS:verbosity=2 %run %t 2>&1 | FileCheck %s<br>
+// RUN: LSAN_OPTIONS=$LSAN_BASE %run %t 2>&1 | FileCheck %s<br>
<br>
 #include <stdio.h><br>
 #include <stdlib.h><br>
<br>
Modified: compiler-rt/trunk/test/lsan/TestCases/leak_check_at_exit.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/lsan/TestCases/leak_check_at_exit.cc?rev=215949&r1=215948&r2=215949&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/lsan/TestCases/leak_check_at_exit.cc?rev=215949&r1=215948&r2=215949&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/test/lsan/TestCases/leak_check_at_exit.cc (original)<br>
+++ compiler-rt/trunk/test/lsan/TestCases/leak_check_at_exit.cc Mon Aug 18 18:39:47 2014<br>
@@ -3,8 +3,8 @@<br>
 // RUN: %clangxx_lsan %s -o %t<br>
 // RUN: LSAN_OPTIONS=$LSAN_BASE not %run %t foo 2>&1 | FileCheck %s --check-prefix=CHECK-do<br>
 // RUN: LSAN_OPTIONS=$LSAN_BASE not %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-do<br>
-// RUN: LSAN_OPTIONS=$LSAN_BASE:"leak_check_at_exit=0" ASAN_OPTIONS="$ASAN_OPTIONS:leak_check_at_exit=0" not %run %t foo 2>&1 | FileCheck %s --check-prefix=CHECK-do<br>
-// RUN: LSAN_OPTIONS=%LSAN_BASE:"leak_check_at_exit=0" ASAN_OPTIONS="$ASAN_OPTIONS:leak_check_at_exit=0" %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-dont<br>
+// RUN: LSAN_OPTIONS=$LSAN_BASE:"leak_check_at_exit=0" not %run %t foo 2>&1 | FileCheck %s --check-prefix=CHECK-do<br>
+// RUN: LSAN_OPTIONS=%LSAN_BASE:"leak_check_at_exit=0" %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-dont<br>
<br>
 #include <stdio.h><br>
 #include <stdlib.h><br>
<br>
Modified: compiler-rt/trunk/test/lsan/TestCases/print_suppressions.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/lsan/TestCases/print_suppressions.cc?rev=215949&r1=215948&r2=215949&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/lsan/TestCases/print_suppressions.cc?rev=215949&r1=215948&r2=215949&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/test/lsan/TestCases/print_suppressions.cc (original)<br>
+++ compiler-rt/trunk/test/lsan/TestCases/print_suppressions.cc Mon Aug 18 18:39:47 2014<br>
@@ -2,9 +2,9 @@<br>
 // matched. Default is print_suppressions=true.<br>
 // RUN: LSAN_BASE="use_registers=0:use_stacks=0"<br>
 // RUN: %clangxx_lsan %s -o %t<br>
-// RUN: LSAN_OPTIONS=$LSAN_BASE:print_suppressions=0 ASAN_OPTIONS=$ASAN_OPTIONS:print_suppressions=0 %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-dont-print<br>
+// RUN: LSAN_OPTIONS=$LSAN_BASE:print_suppressions=0 %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-dont-print<br>
 // RUN: LSAN_OPTIONS=$LSAN_BASE %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-dont-print<br>
-// RUN: LSAN_OPTIONS=$LSAN_BASE:print_suppressions=0 ASAN_OPTIONS=$ASAN_OPTIONS:print_suppressions=0 %run %t foo 2>&1 | FileCheck %s --check-prefix=CHECK-dont-print<br>
+// RUN: LSAN_OPTIONS=$LSAN_BASE:print_suppressions=0 %run %t foo 2>&1 | FileCheck %s --check-prefix=CHECK-dont-print<br>
 // RUN: LSAN_OPTIONS=$LSAN_BASE %run %t foo 2>&1 | FileCheck %s --check-prefix=CHECK-print<br>
<br>
 #include <stdio.h><br>
<br>
Modified: compiler-rt/trunk/test/lsan/TestCases/suppressions_file.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/lsan/TestCases/suppressions_file.cc?rev=215949&r1=215948&r2=215949&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/lsan/TestCases/suppressions_file.cc?rev=215949&r1=215948&r2=215949&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/test/lsan/TestCases/suppressions_file.cc (original)<br>
+++ compiler-rt/trunk/test/lsan/TestCases/suppressions_file.cc Mon Aug 18 18:39:47 2014<br>
@@ -2,10 +2,10 @@<br>
 // RUN: %clangxx_lsan %s -o %t<br>
<br>
 // RUN: echo "leak:*LSanTestLeakingFunc*" > %t.supp1<br>
-// RUN: LSAN_OPTIONS=$LSAN_BASE:suppressions=%t.supp1 ASAN_OPTIONS=$ASAN_OPTIONS:suppressions=%t.supp1 not %run %t 2>&1 | FileCheck %s<br>
+// RUN: LSAN_OPTIONS=$LSAN_BASE:suppressions=%t.supp1 not %run %t 2>&1 | FileCheck %s<br>
<br>
 // RUN: echo "leak:%t" > %t.supp2<br>
-// RUN: LSAN_OPTIONS=$LSAN_BASE:suppressions="%t.supp2":symbolize=false ASAN_OPTIONS=$ASAN_OPTIONS:suppressions="%t.supp2" %run %t<br>
+// RUN: LSAN_OPTIONS=$LSAN_BASE:suppressions="%t.supp2":symbolize=false %run %t<br>
<br>
 #include <stdio.h><br>
 #include <stdlib.h><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></div>