1 //===-- ubsan_flags.cpp ---------------------------------------------------===//
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
7 //===----------------------------------------------------------------------===//
9 // Runtime flags for UndefinedBehaviorSanitizer.
11 //===----------------------------------------------------------------------===//
13 #include "ubsan_platform.h"
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"
24 const char *MaybeCallUbsanDefaultOptions() {
25 return (&__ubsan_default_options) ? __ubsan_default_options() : "";
28 static const char *GetFlag(const char *flag) {
29 // We cannot call getenv() from inside a preinit array initializer
30 if (SANITIZER_CAN_USE_PREINIT_ARRAY) {
39 void Flags::SetDefaults() {
40 #define UBSAN_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue;
41 #include "ubsan_flags.inc"
45 void 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"
52 void InitializeFlags() {
53 SetCommonFlagsDefaults();
56 cf.CopyFrom(*common_flags());
57 cf.external_symbolizer_path = GetFlag("UBSAN_SYMBOLIZER_PATH");
58 OverrideCommonFlags(cf);
65 RegisterCommonFlags(&parser);
66 RegisterUbsanFlags(&parser, f);
68 // Override from user-specified string.
69 parser.ParseString(MaybeCallUbsanDefaultOptions());
70 // Override from environment variable.
71 parser.ParseStringFromEnv("UBSAN_OPTIONS");
72 InitializeCommonFlags();
73 if (Verbosity()) ReportUnrecognizedFlags();
75 if (common_flags()->help) parser.PrintFlagDescriptions();
78 } // namespace __ubsan
80 SANITIZER_INTERFACE_WEAK_DEF(const char *, __ubsan_default_options, void) {
84 #endif // CAN_SANITIZE_UB