[compiler-rt] r215949 - [LSan] Parse common flags from LSAN_OPTIONS even if LSan is combined with

Sergey Matveev earthdok at google.com
Fri Aug 22 07:26:57 PDT 2014


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.


On Tue, Aug 19, 2014 at 3:39 AM, Alexey Samsonov <vonosmas at gmail.com> wrote:

> Author: samsonov
> Date: Mon Aug 18 18:39:47 2014
> New Revision: 215949
>
> URL: http://llvm.org/viewvc/llvm-project?rev=215949&view=rev
> Log:
> [LSan] Parse common flags from LSAN_OPTIONS even if LSan is combined with
> another sanitizer.
>
> A user may run both LSan and LSan+ASan. It is weird to pass path to leak
> suppression file (or other common sanitizer flags, like "verbosity") in
> "LSAN_OPTIONS" in the first case and in "ASAN_OPTIONS" in the second case.
>
>
> Modified:
>     compiler-rt/trunk/lib/asan/asan_rtl.cc
>     compiler-rt/trunk/lib/lsan/lsan.cc
>     compiler-rt/trunk/lib/lsan/lsan_common.cc
>     compiler-rt/trunk/lib/lsan/lsan_common.h
>     compiler-rt/trunk/test/lsan/TestCases/ignore_object.cc
>     compiler-rt/trunk/test/lsan/TestCases/ignore_object_errors.cc
>     compiler-rt/trunk/test/lsan/TestCases/leak_check_at_exit.cc
>     compiler-rt/trunk/test/lsan/TestCases/print_suppressions.cc
>     compiler-rt/trunk/test/lsan/TestCases/suppressions_file.cc
>
> Modified: compiler-rt/trunk/lib/asan/asan_rtl.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_rtl.cc?rev=215949&r1=215948&r2=215949&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/asan/asan_rtl.cc (original)
> +++ compiler-rt/trunk/lib/asan/asan_rtl.cc Mon Aug 18 18:39:47 2014
> @@ -680,7 +680,7 @@ static void AsanInitInternal() {
>    SanitizerInitializeUnwinder();
>
>  #if CAN_SANITIZE_LEAKS
> -  __lsan::InitCommonLsan();
> +  __lsan::InitCommonLsan(false);
>    if (common_flags()->detect_leaks && common_flags()->leak_check_at_exit)
> {
>      Atexit(__lsan::DoLeakCheck);
>    }
>
> Modified: compiler-rt/trunk/lib/lsan/lsan.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/lsan/lsan.cc?rev=215949&r1=215948&r2=215949&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/lsan/lsan.cc (original)
> +++ compiler-rt/trunk/lib/lsan/lsan.cc Mon Aug 18 18:39:47 2014
> @@ -25,16 +25,6 @@ bool lsan_init_is_running;
>
>  namespace __lsan {
>
> -static void InitializeCommonFlags() {
> -  CommonFlags *cf = common_flags();
> -  SetCommonFlagsDefaults(cf);
> -  cf->external_symbolizer_path = GetEnv("LSAN_SYMBOLIZER_PATH");
> -  cf->malloc_context_size = 30;
> -  cf->detect_leaks = true;
> -
> -  ParseCommonFlagsFromString(cf, GetEnv("LSAN_OPTIONS"));
> -}
> -
>  ///// Interface to the common LSan module. /////
>  bool WordIsPoisoned(uptr addr) {
>    return false;
> @@ -50,7 +40,7 @@ extern "C" void __lsan_init() {
>      return;
>    lsan_init_is_running = true;
>    SanitizerToolName = "LeakSanitizer";
> -  InitializeCommonFlags();
> +  InitCommonLsan(true);
>    InitializeAllocator();
>    InitTlsSize();
>    InitializeInterceptors();
> @@ -62,7 +52,6 @@ extern "C" void __lsan_init() {
>
>    Symbolizer::GetOrInit();
>
> -  InitCommonLsan();
>    if (common_flags()->detect_leaks && common_flags()->leak_check_at_exit)
>      Atexit(DoLeakCheck);
>    lsan_inited = true;
>
> Modified: compiler-rt/trunk/lib/lsan/lsan_common.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/lsan/lsan_common.cc?rev=215949&r1=215948&r2=215949&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/lsan/lsan_common.cc (original)
> +++ compiler-rt/trunk/lib/lsan/lsan_common.cc Mon Aug 18 18:39:47 2014
> @@ -36,7 +36,7 @@ bool DisabledInThisThread() { return dis
>
>  Flags lsan_flags;
>
> -static void InitializeFlags() {
> +static void InitializeFlags(bool standalone) {
>    Flags *f = flags();
>    // Default values.
>    f->report_objects = false;
> @@ -71,6 +71,17 @@ static void InitializeFlags() {
>      ParseFlag(options, &f->log_threads, "log_threads", "");
>      ParseFlag(options, &f->exitcode, "exitcode", "");
>    }
> +
> +  // Set defaults for common flags (only in standalone mode) and parse
> +  // them from LSAN_OPTIONS.
> +  CommonFlags *cf = common_flags();
> +  if (standalone) {
> +    SetCommonFlagsDefaults(cf);
> +    cf->external_symbolizer_path = GetEnv("LSAN_SYMBOLIZER_PATH");
> +    cf->malloc_context_size = 30;
> +    cf->detect_leaks = true;
> +  }
> +  ParseCommonFlagsFromString(cf, options);
>  }
>
>  #define LOG_POINTERS(...)                           \
> @@ -106,8 +117,8 @@ void InitializeRootRegions() {
>    root_regions = new(placeholder) InternalMmapVector<RootRegion>(1);
>  }
>
> -void InitCommonLsan() {
> -  InitializeFlags();
> +void InitCommonLsan(bool standalone) {
> +  InitializeFlags(standalone);
>    InitializeRootRegions();
>    if (common_flags()->detect_leaks) {
>      // Initialization which can fail or print warnings should only be
> done if
>
> Modified: compiler-rt/trunk/lib/lsan/lsan_common.h
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/lsan/lsan_common.h?rev=215949&r1=215948&r2=215949&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/lsan/lsan_common.h (original)
> +++ compiler-rt/trunk/lib/lsan/lsan_common.h Mon Aug 18 18:39:47 2014
> @@ -131,7 +131,7 @@ enum IgnoreObjectResult {
>  };
>
>  // Functions called from the parent tool.
> -void InitCommonLsan();
> +void InitCommonLsan(bool standalone);
>  void DoLeakCheck();
>  bool DisabledInThisThread();
>
>
> Modified: compiler-rt/trunk/test/lsan/TestCases/ignore_object.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/lsan/TestCases/ignore_object.cc?rev=215949&r1=215948&r2=215949&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/test/lsan/TestCases/ignore_object.cc (original)
> +++ compiler-rt/trunk/test/lsan/TestCases/ignore_object.cc Mon Aug 18
> 18:39:47 2014
> @@ -1,7 +1,7 @@
>  // Test for __lsan_ignore_object().
>  // RUN:
> LSAN_BASE="report_objects=1:use_registers=0:use_stacks=0:use_globals=0:use_tls=0:verbosity=2"
>  // RUN: %clangxx_lsan %s -o %t
> -// RUN: LSAN_OPTIONS=$LSAN_BASE ASAN_OPTIONS=$ASAN_OPTIONS:"verbosity=2"
> not %run %t 2>&1 | FileCheck %s
> +// RUN: LSAN_OPTIONS=$LSAN_BASE not %run %t 2>&1 | FileCheck %s
>
>  #include <stdio.h>
>  #include <stdlib.h>
>
> Modified: compiler-rt/trunk/test/lsan/TestCases/ignore_object_errors.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/lsan/TestCases/ignore_object_errors.cc?rev=215949&r1=215948&r2=215949&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/test/lsan/TestCases/ignore_object_errors.cc
> (original)
> +++ compiler-rt/trunk/test/lsan/TestCases/ignore_object_errors.cc Mon Aug
> 18 18:39:47 2014
> @@ -1,7 +1,7 @@
>  // Test for incorrect use of __lsan_ignore_object().
>  // RUN: LSAN_BASE="verbosity=2"
>  // RUN: %clangxx_lsan %s -o %t
> -// RUN: LSAN_OPTIONS=$LSAN_BASE ASAN_OPTIONS=$ASAN_OPTIONS:verbosity=2
> %run %t 2>&1 | FileCheck %s
> +// RUN: LSAN_OPTIONS=$LSAN_BASE %run %t 2>&1 | FileCheck %s
>
>  #include <stdio.h>
>  #include <stdlib.h>
>
> Modified: compiler-rt/trunk/test/lsan/TestCases/leak_check_at_exit.cc
> URL:
> 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
>
> ==============================================================================
> --- compiler-rt/trunk/test/lsan/TestCases/leak_check_at_exit.cc (original)
> +++ compiler-rt/trunk/test/lsan/TestCases/leak_check_at_exit.cc Mon Aug 18
> 18:39:47 2014
> @@ -3,8 +3,8 @@
>  // RUN: %clangxx_lsan %s -o %t
>  // RUN: LSAN_OPTIONS=$LSAN_BASE not %run %t foo 2>&1 | FileCheck %s
> --check-prefix=CHECK-do
>  // RUN: LSAN_OPTIONS=$LSAN_BASE not %run %t 2>&1 | FileCheck %s
> --check-prefix=CHECK-do
> -// 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
> -// 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
> +// RUN: LSAN_OPTIONS=$LSAN_BASE:"leak_check_at_exit=0" not %run %t foo
> 2>&1 | FileCheck %s --check-prefix=CHECK-do
> +// RUN: LSAN_OPTIONS=%LSAN_BASE:"leak_check_at_exit=0" %run %t 2>&1 |
> FileCheck %s --check-prefix=CHECK-dont
>
>  #include <stdio.h>
>  #include <stdlib.h>
>
> Modified: compiler-rt/trunk/test/lsan/TestCases/print_suppressions.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/lsan/TestCases/print_suppressions.cc?rev=215949&r1=215948&r2=215949&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/test/lsan/TestCases/print_suppressions.cc (original)
> +++ compiler-rt/trunk/test/lsan/TestCases/print_suppressions.cc Mon Aug 18
> 18:39:47 2014
> @@ -2,9 +2,9 @@
>  // matched. Default is print_suppressions=true.
>  // RUN: LSAN_BASE="use_registers=0:use_stacks=0"
>  // RUN: %clangxx_lsan %s -o %t
> -// 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
> +// RUN: LSAN_OPTIONS=$LSAN_BASE:print_suppressions=0 %run %t 2>&1 |
> FileCheck %s --check-prefix=CHECK-dont-print
>  // RUN: LSAN_OPTIONS=$LSAN_BASE %run %t 2>&1 | FileCheck %s
> --check-prefix=CHECK-dont-print
> -// 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
> +// RUN: LSAN_OPTIONS=$LSAN_BASE:print_suppressions=0 %run %t foo 2>&1 |
> FileCheck %s --check-prefix=CHECK-dont-print
>  // RUN: LSAN_OPTIONS=$LSAN_BASE %run %t foo 2>&1 | FileCheck %s
> --check-prefix=CHECK-print
>
>  #include <stdio.h>
>
> Modified: compiler-rt/trunk/test/lsan/TestCases/suppressions_file.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/lsan/TestCases/suppressions_file.cc?rev=215949&r1=215948&r2=215949&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/test/lsan/TestCases/suppressions_file.cc (original)
> +++ compiler-rt/trunk/test/lsan/TestCases/suppressions_file.cc Mon Aug 18
> 18:39:47 2014
> @@ -2,10 +2,10 @@
>  // RUN: %clangxx_lsan %s -o %t
>
>  // RUN: echo "leak:*LSanTestLeakingFunc*" > %t.supp1
> -// RUN: LSAN_OPTIONS=$LSAN_BASE:suppressions=%t.supp1
> ASAN_OPTIONS=$ASAN_OPTIONS:suppressions=%t.supp1 not %run %t 2>&1 |
> FileCheck %s
> +// RUN: LSAN_OPTIONS=$LSAN_BASE:suppressions=%t.supp1 not %run %t 2>&1 |
> FileCheck %s
>
>  // RUN: echo "leak:%t" > %t.supp2
> -// RUN: LSAN_OPTIONS=$LSAN_BASE:suppressions="%t.supp2":symbolize=false
> ASAN_OPTIONS=$ASAN_OPTIONS:suppressions="%t.supp2" %run %t
> +// RUN: LSAN_OPTIONS=$LSAN_BASE:suppressions="%t.supp2":symbolize=false
> %run %t
>
>  #include <stdio.h>
>  #include <stdlib.h>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140822/061a3e65/attachment.html>


More information about the llvm-commits mailing list