summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2015-01-19 12:22:57 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2015-01-19 12:22:57 +0000
commitec360889f45b9c5be487aa94b6416b475621c599 (patch)
tree19942ebad348ce877b21922c3cfc473cbdf45081 /lib
parent0d45d5ee267a176a0ccadb1cc617779717953977 (diff)
[sanitizer] Make unrecognized flags not fatal.
Print a warning at verbosity=1 and higher instead of dying immediately. git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@226458 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/asan/asan_flags.cc6
-rw-r--r--lib/lsan/lsan_common.cc2
-rw-r--r--lib/msan/msan.cc2
-rw-r--r--lib/sanitizer_common/sanitizer_flag_parser.cc31
-rw-r--r--lib/sanitizer_common/sanitizer_flag_parser.h2
-rw-r--r--lib/sanitizer_common/tests/sanitizer_flags_test.cc9
-rw-r--r--lib/tsan/rtl/tsan_flags.cc5
7 files changed, 48 insertions, 9 deletions
diff --git a/lib/asan/asan_flags.cc b/lib/asan/asan_flags.cc
index d73e43370..811007854 100644
--- a/lib/asan/asan_flags.cc
+++ b/lib/asan/asan_flags.cc
@@ -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) {
diff --git a/lib/lsan/lsan_common.cc b/lib/lsan/lsan_common.cc
index c005f46fc..0f74a7ac2 100644
--- a/lib/lsan/lsan_common.cc
+++ b/lib/lsan/lsan_common.cc
@@ -75,6 +75,8 @@ static void InitializeFlags(bool standalone) {
const char *options = GetEnv("LSAN_OPTIONS");
parser.ParseString(options);
+ if (common_flags()->verbosity) ReportUnrecognizedFlags();
+
if (!help_before && common_flags()->help)
parser.PrintFlagDescriptions();
}
diff --git a/lib/msan/msan.cc b/lib/msan/msan.cc
index 81c623498..e8aeb4539 100644
--- a/lib/msan/msan.cc
+++ b/lib/msan/msan.cc
@@ -157,6 +157,8 @@ static void InitializeFlags(Flags *f, const char *options) {
parser.ParseString(options);
+ if (common_flags()->verbosity) ReportUnrecognizedFlags();
+
if (common_flags()->help) parser.PrintFlagDescriptions();
// Check flag values:
diff --git a/lib/sanitizer_common/sanitizer_flag_parser.cc b/lib/sanitizer_common/sanitizer_flag_parser.cc
index 64b4f5392..d125002da 100644
--- a/lib/sanitizer_common/sanitizer_flag_parser.cc
+++ b/lib/sanitizer_common/sanitizer_flag_parser.cc
@@ -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 *name, const char *value) {
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,
diff --git a/lib/sanitizer_common/sanitizer_flag_parser.h b/lib/sanitizer_common/sanitizer_flag_parser.h
index b391cab41..87afb8238 100644
--- a/lib/sanitizer_common/sanitizer_flag_parser.h
+++ b/lib/sanitizer_common/sanitizer_flag_parser.h
@@ -114,6 +114,8 @@ static void RegisterFlag(FlagParser *parser, const char *name, const char *desc,
parser->RegisterHandler(name, fh, desc);
}
+void ReportUnrecognizedFlags();
+
} // namespace __sanitizer
#endif // SANITIZER_FLAG_REGISTRY_H
diff --git a/lib/sanitizer_common/tests/sanitizer_flags_test.cc b/lib/sanitizer_common/tests/sanitizer_flags_test.cc
index 65adee07d..3e5d8381e 100644
--- a/lib/sanitizer_common/tests/sanitizer_flags_test.cc
+++ b/lib/sanitizer_common/tests/sanitizer_flags_test.cc
@@ -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) {
diff --git a/lib/tsan/rtl/tsan_flags.cc b/lib/tsan/rtl/tsan_flags.cc
index b99d92fc8..c809ee77f 100644
--- a/lib/tsan/rtl/tsan_flags.cc
+++ b/lib/tsan/rtl/tsan_flags.cc
@@ -80,8 +80,9 @@ void InitializeFlags(Flags *f, const char *env) {
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"