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