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