xref: /netbsd-src/external/gpl3/gcc.old/dist/libsanitizer/ubsan/ubsan_flags.cc (revision c0a68be459da21030695f60d10265c2fc49758f8)
1 //===-- ubsan_flags.cc ----------------------------------------------------===//
2 //
3 // This file is distributed under the University of Illinois Open Source
4 // License. See LICENSE.TXT for details.
5 //
6 //===----------------------------------------------------------------------===//
7 //
8 // Runtime flags for UndefinedBehaviorSanitizer.
9 //
10 //===----------------------------------------------------------------------===//
11 
12 #include "ubsan_platform.h"
13 #if CAN_SANITIZE_UB
14 #include "ubsan_flags.h"
15 #include "sanitizer_common/sanitizer_common.h"
16 #include "sanitizer_common/sanitizer_flags.h"
17 #include "sanitizer_common/sanitizer_flag_parser.h"
18 
19 #include <stdlib.h>
20 
21 namespace __ubsan {
22 
MaybeCallUbsanDefaultOptions()23 const char *MaybeCallUbsanDefaultOptions() {
24   return (&__ubsan_default_options) ? __ubsan_default_options() : "";
25 }
26 
GetFlag(const char * flag)27 static const char *GetFlag(const char *flag) {
28   // We cannot call getenv() from inside a preinit array initializer
29   if (SANITIZER_CAN_USE_PREINIT_ARRAY) {
30     return GetEnv(flag);
31   } else {
32     return getenv(flag);
33   }
34 }
35 
36 Flags ubsan_flags;
37 
SetDefaults()38 void Flags::SetDefaults() {
39 #define UBSAN_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue;
40 #include "ubsan_flags.inc"
41 #undef UBSAN_FLAG
42 }
43 
RegisterUbsanFlags(FlagParser * parser,Flags * f)44 void RegisterUbsanFlags(FlagParser *parser, Flags *f) {
45 #define UBSAN_FLAG(Type, Name, DefaultValue, Description) \
46   RegisterFlag(parser, #Name, Description, &f->Name);
47 #include "ubsan_flags.inc"
48 #undef UBSAN_FLAG
49 }
50 
InitializeFlags()51 void InitializeFlags() {
52   SetCommonFlagsDefaults();
53   {
54     CommonFlags cf;
55     cf.CopyFrom(*common_flags());
56     cf.print_summary = false;
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.ParseString(GetFlag("UBSAN_OPTIONS"));
72   InitializeCommonFlags();
73   if (Verbosity()) ReportUnrecognizedFlags();
74 
75   if (common_flags()->help) parser.PrintFlagDescriptions();
76 }
77 
78 }  // namespace __ubsan
79 
SANITIZER_INTERFACE_WEAK_DEF(const char *,__ubsan_default_options,void)80 SANITIZER_INTERFACE_WEAK_DEF(const char *, __ubsan_default_options, void) {
81   return "";
82 }
83 
84 #endif  // CAN_SANITIZE_UB
85