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
21namespace __ubsan {
22
23const char *MaybeCallUbsanDefaultOptions() {
24  return (&__ubsan_default_options) ? __ubsan_default_options() : "";
25}
26
27static 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
36Flags ubsan_flags;
37
38void Flags::SetDefaults() {
39#define UBSAN_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue;
40#include "ubsan_flags.inc"
41#undef UBSAN_FLAG
42}
43
44void 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
51void 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
80SANITIZER_INTERFACE_WEAK_DEF(const char *, __ubsan_default_options, void) {
81  return "";
82}
83
84#endif  // CAN_SANITIZE_UB
85