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 24static 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 33Flags ubsan_flags; 34 35void Flags::SetDefaults() { 36#define UBSAN_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue; 37#include "ubsan_flags.inc" 38#undef UBSAN_FLAG 39} 40 41void 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 48void InitializeFlags() { 49 SetCommonFlagsDefaults(); 50 { 51 CommonFlags cf; 52 cf.CopyFrom(*common_flags()); 53 cf.external_symbolizer_path = GetFlag("UBSAN_SYMBOLIZER_PATH"); 54 OverrideCommonFlags(cf); 55 } 56 57 Flags *f = flags(); 58 f->SetDefaults(); 59 60 FlagParser parser; 61 RegisterCommonFlags(&parser); 62 RegisterUbsanFlags(&parser, f); 63 64 // Override from user-specified string. 65 parser.ParseString(__ubsan_default_options()); 66 // Override from environment variable. 67 parser.ParseStringFromEnv("UBSAN_OPTIONS"); 68 InitializeCommonFlags(); 69 if (Verbosity()) ReportUnrecognizedFlags(); 70 71 if (common_flags()->help) parser.PrintFlagDescriptions(); 72} 73 74} // namespace __ubsan 75 76SANITIZER_INTERFACE_WEAK_DEF(const char *, __ubsan_default_options, void) { 77 return ""; 78} 79 80#endif // CAN_SANITIZE_UB 81