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