]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/compiler-rt/lib/ubsan/ubsan_flags.cc
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / compiler-rt / lib / ubsan / ubsan_flags.cc
1 //===-- ubsan_flags.cc ----------------------------------------------------===//
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.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
81 SANITIZER_INTERFACE_WEAK_DEF(const char *, __ubsan_default_options, void) {
82   return "";
83 }
84
85 #endif  // CAN_SANITIZE_UB