1 1.1 kamil //===-- ubsan_flags.cc ----------------------------------------------------===// 2 1.1 kamil // 3 1.1 kamil // The LLVM Compiler Infrastructure 4 1.1 kamil // 5 1.1 kamil // This file is distributed under the University of Illinois Open Source 6 1.1 kamil // License. See LICENSE.TXT for details. 7 1.1 kamil // 8 1.1 kamil //===----------------------------------------------------------------------===// 9 1.1 kamil // 10 1.1 kamil // Runtime flags for UndefinedBehaviorSanitizer. 11 1.1 kamil // 12 1.1 kamil //===----------------------------------------------------------------------===// 13 1.1 kamil 14 1.1 kamil #include "ubsan_platform.h" 15 1.1 kamil #if CAN_SANITIZE_UB 16 1.1 kamil #include "ubsan_flags.h" 17 1.1 kamil #include "sanitizer_common/sanitizer_common.h" 18 1.1 kamil #include "sanitizer_common/sanitizer_flags.h" 19 1.1 kamil #include "sanitizer_common/sanitizer_flag_parser.h" 20 1.1 kamil 21 1.1 kamil #include <stdlib.h> 22 1.1 kamil 23 1.1 kamil namespace __ubsan { 24 1.1 kamil 25 1.1 kamil const char *MaybeCallUbsanDefaultOptions() { 26 1.1 kamil return (&__ubsan_default_options) ? __ubsan_default_options() : ""; 27 1.1 kamil } 28 1.1 kamil 29 1.1 kamil static const char *GetFlag(const char *flag) { 30 1.1 kamil // We cannot call getenv() from inside a preinit array initializer 31 1.1 kamil if (SANITIZER_CAN_USE_PREINIT_ARRAY) { 32 1.1 kamil return GetEnv(flag); 33 1.1 kamil } else { 34 1.1 kamil return getenv(flag); 35 1.1 kamil } 36 1.1 kamil } 37 1.1 kamil 38 1.1 kamil Flags ubsan_flags; 39 1.1 kamil 40 1.1 kamil void Flags::SetDefaults() { 41 1.1 kamil #define UBSAN_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue; 42 1.1 kamil #include "ubsan_flags.inc" 43 1.1 kamil #undef UBSAN_FLAG 44 1.1 kamil } 45 1.1 kamil 46 1.1 kamil void RegisterUbsanFlags(FlagParser *parser, Flags *f) { 47 1.1 kamil #define UBSAN_FLAG(Type, Name, DefaultValue, Description) \ 48 1.1 kamil RegisterFlag(parser, #Name, Description, &f->Name); 49 1.1 kamil #include "ubsan_flags.inc" 50 1.1 kamil #undef UBSAN_FLAG 51 1.1 kamil } 52 1.1 kamil 53 1.1 kamil void InitializeFlags() { 54 1.1 kamil SetCommonFlagsDefaults(); 55 1.1 kamil { 56 1.1 kamil CommonFlags cf; 57 1.1 kamil cf.CopyFrom(*common_flags()); 58 1.1 kamil cf.print_summary = false; 59 1.1 kamil cf.external_symbolizer_path = GetFlag("UBSAN_SYMBOLIZER_PATH"); 60 1.1 kamil OverrideCommonFlags(cf); 61 1.1 kamil } 62 1.1 kamil 63 1.1 kamil Flags *f = flags(); 64 1.1 kamil f->SetDefaults(); 65 1.1 kamil 66 1.1 kamil FlagParser parser; 67 1.1 kamil RegisterCommonFlags(&parser); 68 1.1 kamil RegisterUbsanFlags(&parser, f); 69 1.1 kamil 70 1.1 kamil // Override from user-specified string. 71 1.1 kamil parser.ParseString(MaybeCallUbsanDefaultOptions()); 72 1.1 kamil // Override from environment variable. 73 1.1 kamil parser.ParseString(GetFlag("UBSAN_OPTIONS")); 74 1.1 kamil InitializeCommonFlags(); 75 1.1 kamil if (Verbosity()) ReportUnrecognizedFlags(); 76 1.1 kamil 77 1.1 kamil if (common_flags()->help) parser.PrintFlagDescriptions(); 78 1.1 kamil } 79 1.1 kamil 80 1.1 kamil } // namespace __ubsan 81 1.1 kamil 82 1.1 kamil SANITIZER_INTERFACE_WEAK_DEF(const char *, __ubsan_default_options, void) { 83 1.1 kamil return ""; 84 1.1 kamil } 85 1.1 kamil 86 1.1 kamil #endif // CAN_SANITIZE_UB 87