diff options
Diffstat (limited to 'compiler-rt/lib/sanitizer_common')
3 files changed, 38 insertions, 4 deletions
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_flag_parser.cc b/compiler-rt/lib/sanitizer_common/sanitizer_flag_parser.cc index 64b4f539208..d125002daf4 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_flag_parser.cc +++ b/compiler-rt/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/compiler-rt/lib/sanitizer_common/sanitizer_flag_parser.h b/compiler-rt/lib/sanitizer_common/sanitizer_flag_parser.h index b391cab4173..87afb8238c0 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_flag_parser.h +++ b/compiler-rt/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/compiler-rt/lib/sanitizer_common/tests/sanitizer_flags_test.cc b/compiler-rt/lib/sanitizer_common/tests/sanitizer_flags_test.cc index 65adee07d1f..3e5d8381ed3 100644 --- a/compiler-rt/lib/sanitizer_common/tests/sanitizer_flags_test.cc +++ b/compiler-rt/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) { |