diff options
Diffstat (limited to 'lib/gwp_asan/optional/options_parser.cpp')
| -rw-r--r-- | lib/gwp_asan/optional/options_parser.cpp | 93 | 
1 files changed, 93 insertions, 0 deletions
diff --git a/lib/gwp_asan/optional/options_parser.cpp b/lib/gwp_asan/optional/options_parser.cpp new file mode 100644 index 0000000000000..6c2167288d6c5 --- /dev/null +++ b/lib/gwp_asan/optional/options_parser.cpp @@ -0,0 +1,93 @@ +//===-- options_parser.cpp --------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "gwp_asan/optional/options_parser.h" + +#include <stdarg.h> +#include <stdint.h> +#include <stdlib.h> +#include <string.h> + +#include "gwp_asan/options.h" +#include "sanitizer_common/sanitizer_common.h" +#include "sanitizer_common/sanitizer_flag_parser.h" +#include "sanitizer_common/sanitizer_flags.h" + +namespace gwp_asan { +namespace options { +namespace { +void registerGwpAsanFlags(__sanitizer::FlagParser *parser, Options *o) { +#define GWP_ASAN_OPTION(Type, Name, DefaultValue, Description)                 \ +  RegisterFlag(parser, #Name, Description, &o->Name); +#include "gwp_asan/options.inc" +#undef GWP_ASAN_OPTION +} + +const char *getCompileDefinitionGwpAsanDefaultOptions() { +#ifdef GWP_ASAN_DEFAULT_OPTIONS +  return SANITIZER_STRINGIFY(GWP_ASAN_DEFAULT_OPTIONS); +#else +  return ""; +#endif +} + +const char *getGwpAsanDefaultOptions() { +  return (__gwp_asan_default_options) ? __gwp_asan_default_options() : ""; +} + +Options *getOptionsInternal() { +  static Options GwpAsanFlags; +  return &GwpAsanFlags; +} +} // anonymous namespace + +void initOptions() { +  __sanitizer::SetCommonFlagsDefaults(); + +  Options *o = getOptionsInternal(); +  o->setDefaults(); + +  __sanitizer::FlagParser Parser; +  registerGwpAsanFlags(&Parser, o); + +  // Override from compile definition. +  Parser.ParseString(getCompileDefinitionGwpAsanDefaultOptions()); + +  // Override from user-specified string. +  Parser.ParseString(getGwpAsanDefaultOptions()); + +  // Override from environment. +  Parser.ParseString(__sanitizer::GetEnv("GWP_ASAN_OPTIONS")); + +  __sanitizer::InitializeCommonFlags(); +  if (__sanitizer::Verbosity()) +    __sanitizer::ReportUnrecognizedFlags(); + +  if (!o->Enabled) +    return; + +  // Sanity checks for the parameters. +  if (o->MaxSimultaneousAllocations <= 0) { +    __sanitizer::Printf("GWP-ASan ERROR: MaxSimultaneousAllocations must be > " +                        "0 when GWP-ASan is enabled.\n"); +    exit(EXIT_FAILURE); +  } + +  if (o->SampleRate < 1) { +    __sanitizer::Printf( +        "GWP-ASan ERROR: SampleRate must be > 0 when GWP-ASan is enabled.\n"); +    exit(EXIT_FAILURE); +  } + +  o->Printf = __sanitizer::Printf; +} + +Options &getOptions() { return *getOptionsInternal(); } + +} // namespace options +} // namespace gwp_asan  | 
