xref: /llvm-project/compiler-rt/lib/ubsan/ubsan_flags.cpp (revision 2d7fd38cf7db18edbbfa0e6dfb7454a255171867)
146ba9697SNico Weber //===-- ubsan_flags.cpp ---------------------------------------------------===//
246ba9697SNico Weber //
346ba9697SNico Weber // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
446ba9697SNico Weber // See https://llvm.org/LICENSE.txt for license information.
546ba9697SNico Weber // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
646ba9697SNico Weber //
746ba9697SNico Weber //===----------------------------------------------------------------------===//
846ba9697SNico Weber //
946ba9697SNico Weber // Runtime flags for UndefinedBehaviorSanitizer.
1046ba9697SNico Weber //
1146ba9697SNico Weber //===----------------------------------------------------------------------===//
1246ba9697SNico Weber 
1346ba9697SNico Weber #include "ubsan_platform.h"
1446ba9697SNico Weber #if CAN_SANITIZE_UB
1546ba9697SNico Weber #include "ubsan_flags.h"
1646ba9697SNico Weber #include "sanitizer_common/sanitizer_common.h"
1746ba9697SNico Weber #include "sanitizer_common/sanitizer_flags.h"
1846ba9697SNico Weber #include "sanitizer_common/sanitizer_flag_parser.h"
1946ba9697SNico Weber 
2046ba9697SNico Weber #include <stdlib.h>
2146ba9697SNico Weber 
2246ba9697SNico Weber namespace __ubsan {
2346ba9697SNico Weber 
GetFlag(const char * flag)2446ba9697SNico Weber static const char *GetFlag(const char *flag) {
2546ba9697SNico Weber   // We cannot call getenv() from inside a preinit array initializer
2646ba9697SNico Weber   if (SANITIZER_CAN_USE_PREINIT_ARRAY) {
2746ba9697SNico Weber     return GetEnv(flag);
2846ba9697SNico Weber   } else {
2946ba9697SNico Weber     return getenv(flag);
3046ba9697SNico Weber   }
3146ba9697SNico Weber }
3246ba9697SNico Weber 
3346ba9697SNico Weber Flags ubsan_flags;
3446ba9697SNico Weber 
SetDefaults()3546ba9697SNico Weber void Flags::SetDefaults() {
3646ba9697SNico Weber #define UBSAN_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue;
3746ba9697SNico Weber #include "ubsan_flags.inc"
3846ba9697SNico Weber #undef UBSAN_FLAG
3946ba9697SNico Weber }
4046ba9697SNico Weber 
RegisterUbsanFlags(FlagParser * parser,Flags * f)4146ba9697SNico Weber void RegisterUbsanFlags(FlagParser *parser, Flags *f) {
4246ba9697SNico Weber #define UBSAN_FLAG(Type, Name, DefaultValue, Description) \
4346ba9697SNico Weber   RegisterFlag(parser, #Name, Description, &f->Name);
4446ba9697SNico Weber #include "ubsan_flags.inc"
4546ba9697SNico Weber #undef UBSAN_FLAG
4646ba9697SNico Weber }
4746ba9697SNico Weber 
InitializeFlags()4846ba9697SNico Weber void InitializeFlags() {
4946ba9697SNico Weber   SetCommonFlagsDefaults();
5046ba9697SNico Weber   {
5146ba9697SNico Weber     CommonFlags cf;
5246ba9697SNico Weber     cf.CopyFrom(*common_flags());
5346ba9697SNico Weber     cf.external_symbolizer_path = GetFlag("UBSAN_SYMBOLIZER_PATH");
5446ba9697SNico Weber     OverrideCommonFlags(cf);
5546ba9697SNico Weber   }
5646ba9697SNico Weber 
5746ba9697SNico Weber   Flags *f = flags();
5846ba9697SNico Weber   f->SetDefaults();
5946ba9697SNico Weber 
6046ba9697SNico Weber   FlagParser parser;
6146ba9697SNico Weber   RegisterCommonFlags(&parser);
6246ba9697SNico Weber   RegisterUbsanFlags(&parser, f);
6346ba9697SNico Weber 
6446ba9697SNico Weber   // Override from user-specified string.
65*2d7fd38cSFangrui Song   parser.ParseString(__ubsan_default_options());
6646ba9697SNico Weber   // Override from environment variable.
6746ba9697SNico Weber   parser.ParseStringFromEnv("UBSAN_OPTIONS");
6846ba9697SNico Weber   InitializeCommonFlags();
6946ba9697SNico Weber   if (Verbosity()) ReportUnrecognizedFlags();
7046ba9697SNico Weber 
7146ba9697SNico Weber   if (common_flags()->help) parser.PrintFlagDescriptions();
7246ba9697SNico Weber }
7346ba9697SNico Weber 
7446ba9697SNico Weber }  // namespace __ubsan
7546ba9697SNico Weber 
SANITIZER_INTERFACE_WEAK_DEF(const char *,__ubsan_default_options,void)7646ba9697SNico Weber SANITIZER_INTERFACE_WEAK_DEF(const char *, __ubsan_default_options, void) {
7746ba9697SNico Weber   return "";
7846ba9697SNico Weber }
7946ba9697SNico Weber 
8046ba9697SNico Weber #endif  // CAN_SANITIZE_UB
81