diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2015-01-15 15:13:43 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2015-01-15 15:13:43 +0000 |
commit | 096af34b7cf9920da660a3084b5485ba97059f35 (patch) | |
tree | 8f2a32c53687aba186ca91e2b782fa9bb57e4d44 /lib/msan/msan.cc | |
parent | 05fe0575f84ea38fa2eca8a5bdea5c77f3217cda (diff) |
[sanitizer] Flag parser rewrite.
The new parser is a lot stricter about syntax, reports unrecognized
flags, and will make it easier to implemented some of the planned features.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@226169 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/msan/msan.cc')
-rw-r--r-- | lib/msan/msan.cc | 50 |
1 files changed, 34 insertions, 16 deletions
diff --git a/lib/msan/msan.cc b/lib/msan/msan.cc index 6eccb5bf6..c8bd6039c 100644 --- a/lib/msan/msan.cc +++ b/lib/msan/msan.cc @@ -19,13 +19,13 @@ #include "sanitizer_common/sanitizer_atomic.h" #include "sanitizer_common/sanitizer_common.h" #include "sanitizer_common/sanitizer_flags.h" +#include "sanitizer_common/sanitizer_flag_parser.h" #include "sanitizer_common/sanitizer_libc.h" #include "sanitizer_common/sanitizer_procmaps.h" #include "sanitizer_common/sanitizer_stacktrace.h" #include "sanitizer_common/sanitizer_symbolizer.h" #include "sanitizer_common/sanitizer_stackdepot.h" - // ACHTUNG! No system header includes in this file. using namespace __sanitizer; @@ -102,20 +102,40 @@ void Flags::SetDefaults() { #undef MSAN_FLAG } -void Flags::ParseFromString(const char *str) { - // keep_going is an old name for halt_on_error, - // and it has inverse meaning. - halt_on_error = !halt_on_error; - ParseFlag(str, &halt_on_error, "keep_going", ""); - halt_on_error = !halt_on_error; +// keep_going is an old name for halt_on_error, +// and it has inverse meaning. +class FlagHandlerKeepGoing : public FlagHandlerBase { + bool *halt_on_error_; + + public: + explicit FlagHandlerKeepGoing(bool *halt_on_error) + : halt_on_error_(halt_on_error) {} + bool Parse(const char *value) { + bool tmp; + FlagHandler<bool> h(&tmp); + if (!h.Parse(value)) return false; + *halt_on_error_ = !tmp; + return true; + } +}; -#define MSAN_FLAG(Type, Name, DefaultValue, Description) \ - ParseFlag(str, &Name, #Name, Description); +void RegisterMsanFlags(FlagParser *parser, Flags *f) { +#define MSAN_FLAG(Type, Name, DefaultValue, Description) \ + RegisterFlag(parser, #Name, Description, &f->Name); #include "msan_flags.inc" #undef MSAN_FLAG + + FlagHandlerKeepGoing *fh_keep_going = + new (INTERNAL_ALLOC) FlagHandlerKeepGoing(&f->halt_on_error); // NOLINT + parser->RegisterHandler("keep_going", fh_keep_going, + "deprecated, use halt_on_error"); } static void InitializeFlags(Flags *f, const char *options) { + FlagParser parser; + RegisterMsanFlags(&parser, f); + RegisterCommonFlags(&parser); + SetCommonFlagsDefaults(); { CommonFlags cf; @@ -132,13 +152,12 @@ static void InitializeFlags(Flags *f, const char *options) { f->SetDefaults(); // Override from user-specified string. - if (__msan_default_options) { - f->ParseFromString(__msan_default_options()); - ParseCommonFlagsFromString(__msan_default_options()); - } + if (__msan_default_options) + parser.ParseString(__msan_default_options()); + + parser.ParseString(options); - f->ParseFromString(options); - ParseCommonFlagsFromString(options); + if (common_flags()->help) parser.PrintFlagDescriptions(); // Check flag values: if (f->exit_code < 0 || f->exit_code > 127) { @@ -328,7 +347,6 @@ void __msan_init() { const char *msan_options = GetEnv("MSAN_OPTIONS"); InitializeFlags(&msan_flags, msan_options); - if (common_flags()->help) PrintFlagDescriptions(); __sanitizer_set_report_path(common_flags()->log_path); InitializeInterceptors(); |