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#include <stdlib.h> 22 23namespace __ubsan { 24 25const char *MaybeCallUbsanDefaultOptions() { 26 return (&__ubsan_default_options) ? __ubsan_default_options() : ""; 27} 28 29static const char *GetFlag(const char *flag) { 30 // We cannot call getenv() from inside a preinit array initializer 31 if (SANITIZER_CAN_USE_PREINIT_ARRAY) { 32 return GetEnv(flag); 33 } else { 34 return getenv(flag); 35 } 36} 37 38Flags ubsan_flags; 39 40void Flags::SetDefaults() { 41#define UBSAN_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue; 42#include "ubsan_flags.inc" 43#undef UBSAN_FLAG 44} 45 46void RegisterUbsanFlags(FlagParser *parser, Flags *f) { 47#define UBSAN_FLAG(Type, Name, DefaultValue, Description) \ 48 RegisterFlag(parser, #Name, Description, &f->Name); 49#include "ubsan_flags.inc" 50#undef UBSAN_FLAG 51} 52 53void InitializeFlags() { 54 SetCommonFlagsDefaults(); 55 { 56 CommonFlags cf; 57 cf.CopyFrom(*common_flags()); 58 cf.print_summary = false; 59 cf.external_symbolizer_path = GetFlag("UBSAN_SYMBOLIZER_PATH"); 60 OverrideCommonFlags(cf); 61 } 62 63 Flags *f = flags(); 64 f->SetDefaults(); 65 66 FlagParser parser; 67 RegisterCommonFlags(&parser); 68 RegisterUbsanFlags(&parser, f); 69 70 // Override from user-specified string. 71 parser.ParseString(MaybeCallUbsanDefaultOptions()); 72 // Override from environment variable. 73 parser.ParseString(GetFlag("UBSAN_OPTIONS")); 74 InitializeCommonFlags(); 75 if (Verbosity()) ReportUnrecognizedFlags(); 76 77 if (common_flags()->help) parser.PrintFlagDescriptions(); 78} 79 80} // namespace __ubsan 81 82SANITIZER_INTERFACE_WEAK_DEF(const char *, __ubsan_default_options, void) { 83 return ""; 84} 85 86#endif // CAN_SANITIZE_UB 87