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