Home | History | Annotate | Download | only in ubsan
      1 //===-- ubsan_flags.cc ----------------------------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // Runtime flags for UndefinedBehaviorSanitizer.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "ubsan_platform.h"
     15 #if CAN_SANITIZE_UB
     16 #include "ubsan_flags.h"
     17 #include "sanitizer_common/sanitizer_common.h"
     18 #include "sanitizer_common/sanitizer_flags.h"
     19 #include "sanitizer_common/sanitizer_flag_parser.h"
     20 
     21 namespace __ubsan {
     22 
     23 const char *MaybeCallUbsanDefaultOptions() {
     24   return (&__ubsan_default_options) ? __ubsan_default_options() : "";
     25 }
     26 
     27 Flags ubsan_flags;
     28 
     29 void Flags::SetDefaults() {
     30 #define UBSAN_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue;
     31 #include "ubsan_flags.inc"
     32 #undef UBSAN_FLAG
     33 }
     34 
     35 void RegisterUbsanFlags(FlagParser *parser, Flags *f) {
     36 #define UBSAN_FLAG(Type, Name, DefaultValue, Description) \
     37   RegisterFlag(parser, #Name, Description, &f->Name);
     38 #include "ubsan_flags.inc"
     39 #undef UBSAN_FLAG
     40 }
     41 
     42 void InitializeFlags() {
     43   SetCommonFlagsDefaults();
     44   {
     45     CommonFlags cf;
     46     cf.CopyFrom(*common_flags());
     47     cf.print_summary = false;
     48     OverrideCommonFlags(cf);
     49   }
     50 
     51   Flags *f = flags();
     52   f->SetDefaults();
     53 
     54   FlagParser parser;
     55   RegisterCommonFlags(&parser);
     56   RegisterUbsanFlags(&parser, f);
     57 
     58   // Override from user-specified string.
     59   parser.ParseString(MaybeCallUbsanDefaultOptions());
     60   // Override from environment variable.
     61   parser.ParseString(GetEnv("UBSAN_OPTIONS"));
     62   SetVerbosity(common_flags()->verbosity);
     63   if (Verbosity()) ReportUnrecognizedFlags();
     64 
     65   if (common_flags()->help) parser.PrintFlagDescriptions();
     66 }
     67 
     68 }  // namespace __ubsan
     69 
     70 extern "C" {
     71 
     72 #if !SANITIZER_SUPPORTS_WEAK_HOOKS
     73 SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE
     74 const char *__ubsan_default_options() { return ""; }
     75 #endif
     76 
     77 #if SANITIZER_WINDOWS
     78 const char *__ubsan_default_default_options() { return ""; }
     79 # ifdef _WIN64
     80 #  pragma comment(linker, "/alternatename:__ubsan_default_options=__ubsan_default_default_options")
     81 # else
     82 #  pragma comment(linker, "/alternatename:___ubsan_default_options=___ubsan_default_default_options")
     83 # endif
     84 #endif
     85 
     86 }  // extern "C"
     87 
     88 #endif  // CAN_SANITIZE_UB
     89