xref: /freebsd/contrib/llvm-project/compiler-rt/lib/ubsan/ubsan_flags.cpp (revision a521f2116473fbd8c09db395518f060a27d02334)
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 
22 namespace __ubsan {
23 
24 const char *MaybeCallUbsanDefaultOptions() {
25   return (&__ubsan_default_options) ? __ubsan_default_options() : "";
26 }
27 
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) {
31     return GetEnv(flag);
32   } else {
33     return getenv(flag);
34   }
35 }
36 
37 Flags ubsan_flags;
38 
39 void Flags::SetDefaults() {
40 #define UBSAN_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue;
41 #include "ubsan_flags.inc"
42 #undef UBSAN_FLAG
43 }
44 
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"
49 #undef UBSAN_FLAG
50 }
51 
52 void InitializeFlags() {
53   SetCommonFlagsDefaults();
54   {
55     CommonFlags cf;
56     cf.CopyFrom(*common_flags());
57     cf.external_symbolizer_path = GetFlag("UBSAN_SYMBOLIZER_PATH");
58     OverrideCommonFlags(cf);
59   }
60 
61   Flags *f = flags();
62   f->SetDefaults();
63 
64   FlagParser parser;
65   RegisterCommonFlags(&parser);
66   RegisterUbsanFlags(&parser, f);
67 
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();
74 
75   if (common_flags()->help) parser.PrintFlagDescriptions();
76 }
77 
78 }  // namespace __ubsan
79 
80 SANITIZER_INTERFACE_WEAK_DEF(const char *, __ubsan_default_options, void) {
81   return "";
82 }
83 
84 #endif  // CAN_SANITIZE_UB
85