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 21namespace __ubsan { 22 23const char *MaybeCallUbsanDefaultOptions() { 24 return (&__ubsan_default_options) ? __ubsan_default_options() : ""; 25} 26 27Flags ubsan_flags; 28 29void Flags::SetDefaults() { 30#define UBSAN_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue; 31#include "ubsan_flags.inc" 32#undef UBSAN_FLAG 33} 34 35void 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 42void 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 70extern "C" { 71 72#if !SANITIZER_SUPPORTS_WEAK_HOOKS 73SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE 74const char *__ubsan_default_options() { return ""; } 75#endif 76 77#if SANITIZER_WINDOWS 78const 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