[compiler-rt] r226458 - [sanitizer] Make unrecognized flags not fatal.

Evgeniy Stepanov eugeni.stepanov at gmail.com
Mon Jan 19 04:22:58 PST 2015


Author: eugenis
Date: Mon Jan 19 06:22:57 2015
New Revision: 226458

URL: http://llvm.org/viewvc/llvm-project?rev=226458&view=rev
Log:
[sanitizer] Make unrecognized flags not fatal.

Print a warning at verbosity=1 and higher instead of dying immediately.

Modified:
    compiler-rt/trunk/lib/asan/asan_flags.cc
    compiler-rt/trunk/lib/lsan/lsan_common.cc
    compiler-rt/trunk/lib/msan/msan.cc
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_flag_parser.cc
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_flag_parser.h
    compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_flags_test.cc
    compiler-rt/trunk/lib/tsan/rtl/tsan_flags.cc
    compiler-rt/trunk/test/sanitizer_common/TestCases/options-invalid.cc

Modified: compiler-rt/trunk/lib/asan/asan_flags.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_flags.cc?rev=226458&r1=226457&r2=226458&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/asan_flags.cc (original)
+++ compiler-rt/trunk/lib/asan/asan_flags.cc Mon Jan 19 06:22:57 2015
@@ -98,9 +98,9 @@ void InitializeFlags(Flags *f) {
       VReport(1, "Parsed activation flags: %s\n", buf);
   }
 
-  if (common_flags()->help) {
-    parser.PrintFlagDescriptions();
-  }
+  if (common_flags()->verbosity) ReportUnrecognizedFlags();
+
+  if (common_flags()->help) parser.PrintFlagDescriptions();
 
   // Flag validation:
   if (!CAN_SANITIZE_LEAKS && common_flags()->detect_leaks) {

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=226458&r1=226457&r2=226458&view=diff
==============================================================================
--- compiler-rt/trunk/lib/lsan/lsan_common.cc (original)
+++ compiler-rt/trunk/lib/lsan/lsan_common.cc Mon Jan 19 06:22:57 2015
@@ -75,6 +75,8 @@ static void InitializeFlags(bool standal
   const char *options = GetEnv("LSAN_OPTIONS");
   parser.ParseString(options);
 
+  if (common_flags()->verbosity) ReportUnrecognizedFlags();
+
   if (!help_before && common_flags()->help)
     parser.PrintFlagDescriptions();
 }

Modified: compiler-rt/trunk/lib/msan/msan.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/msan/msan.cc?rev=226458&r1=226457&r2=226458&view=diff
==============================================================================
--- compiler-rt/trunk/lib/msan/msan.cc (original)
+++ compiler-rt/trunk/lib/msan/msan.cc Mon Jan 19 06:22:57 2015
@@ -157,6 +157,8 @@ static void InitializeFlags(Flags *f, co
 
   parser.ParseString(options);
 
+  if (common_flags()->verbosity) ReportUnrecognizedFlags();
+
   if (common_flags()->help) parser.PrintFlagDescriptions();
 
   // Check flag values:

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_flag_parser.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_flag_parser.cc?rev=226458&r1=226457&r2=226458&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_flag_parser.cc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_flag_parser.cc Mon Jan 19 06:22:57 2015
@@ -22,6 +22,32 @@ namespace __sanitizer {
 
 LowLevelAllocator FlagParser::Alloc;
 
+class UnknownFlags {
+  static const int kMaxUnknownFlags = 20;
+  const char *unknown_flags_[kMaxUnknownFlags];
+  int n_unknown_flags_;
+
+ public:
+  void Add(const char *name) {
+    CHECK_LT(n_unknown_flags_, kMaxUnknownFlags);
+    unknown_flags_[n_unknown_flags_++] = name;
+  }
+
+  void Report() {
+    if (!n_unknown_flags_) return;
+    Printf("WARNING: found %d unrecognized flag(s):\n", n_unknown_flags_);
+    for (int i = 0; i < n_unknown_flags_; ++i)
+      Printf("    %s\n", unknown_flags_[i]);
+    n_unknown_flags_ = 0;
+  }
+};
+
+UnknownFlags unknown_flags;
+
+void ReportUnrecognizedFlags() {
+  unknown_flags.Report();
+}
+
 char *FlagParser::ll_strndup(const char *s, uptr n) {
   uptr len = internal_strnlen(s, n);
   char *s2 = (char*)Alloc.Allocate(len + 1);
@@ -106,8 +132,9 @@ bool FlagParser::run_handler(const char
     if (internal_strcmp(name, flags_[i].name) == 0)
       return flags_[i].handler->Parse(value);
   }
-  Printf("ERROR: Unknown flag: '%s'\n", name);
-  return false;
+  // Unrecognized flag. This is not a fatal error, we may print a warning later.
+  unknown_flags.Add(name);
+  return true;
 }
 
 void FlagParser::RegisterHandler(const char *name, FlagHandlerBase *handler,

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_flag_parser.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_flag_parser.h?rev=226458&r1=226457&r2=226458&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_flag_parser.h (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_flag_parser.h Mon Jan 19 06:22:57 2015
@@ -114,6 +114,8 @@ static void RegisterFlag(FlagParser *par
   parser->RegisterHandler(name, fh, desc);
 }
 
+void ReportUnrecognizedFlags();
+
 }  // namespace __sanitizer
 
 #endif  // SANITIZER_FLAG_REGISTRY_H

Modified: compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_flags_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_flags_test.cc?rev=226458&r1=226457&r2=226458&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_flags_test.cc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_flags_test.cc Mon Jan 19 06:22:57 2015
@@ -63,9 +63,14 @@ TEST(SanitizerCommon, IntFlags) {
   TestFlag(-11, "flag_name=0", 0);
   TestFlag(-11, "flag_name=42", 42);
   TestFlag(-11, "flag_name=-42", -42);
+
+  // Unrecognized flags are ignored.
+  TestFlag(-11, "--flag_name=42", -11);
+  TestFlag(-11, "zzzzzzz=42", -11);
+
   EXPECT_DEATH(TestFlag(-11, "flag_name", 0), "expected '='");
-  EXPECT_DEATH(TestFlag(-11, "--flag_name=42", 0),
-               "Unknown flag: '--flag_name'");
+  EXPECT_DEATH(TestFlag(-11, "flag_name=42U", 0),
+               "Invalid value for int option");
 }
 
 TEST(SanitizerCommon, StrFlags) {

Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_flags.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_flags.cc?rev=226458&r1=226457&r2=226458&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl/tsan_flags.cc (original)
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_flags.cc Mon Jan 19 06:22:57 2015
@@ -80,8 +80,9 @@ void InitializeFlags(Flags *f, const cha
     f->report_signal_unsafe = false;
   }
 
-  if (common_flags()->help)
-    parser.PrintFlagDescriptions();
+  if (common_flags()->verbosity) ReportUnrecognizedFlags();
+
+  if (common_flags()->help) parser.PrintFlagDescriptions();
 
   if (f->history_size < 0 || f->history_size > 7) {
     Printf("ThreadSanitizer: incorrect value for history_size"

Modified: compiler-rt/trunk/test/sanitizer_common/TestCases/options-invalid.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/sanitizer_common/TestCases/options-invalid.cc?rev=226458&r1=226457&r2=226458&view=diff
==============================================================================
--- compiler-rt/trunk/test/sanitizer_common/TestCases/options-invalid.cc (original)
+++ compiler-rt/trunk/test/sanitizer_common/TestCases/options-invalid.cc Mon Jan 19 06:22:57 2015
@@ -1,7 +1,15 @@
 // RUN: %clangxx -O0 %s -o %t
-// RUN: %tool_options=invalid_option_name=10 not %run %t 2>&1 | FileCheck %s
+// RUN: %tool_options=invalid_option_name=10,verbosity=1 %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-V1
+// RUN: %tool_options=invalid_option_name=10 %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-V0
+
+#include <stdio.h>
 
 int main() {
+  fprintf(stderr, "done\n");
 }
 
-// CHECK: Unknown flag{{.*}}invalid_option_name
+// CHECK-V1: WARNING: found 1 unrecognized
+// CHECK-V1:     invalid_option_name
+// CHECK-V0-NOT: WARNING: found 1 unrecognized
+// CHECK-V0-NOT:     invalid_option_name
+// CHECK: done





More information about the llvm-commits mailing list