81 lines · cpp
1//===-- ubsan_flags.cpp ---------------------------------------------------===//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-exception6//7//===----------------------------------------------------------------------===//8//9// Runtime flags for UndefinedBehaviorSanitizer.10//11//===----------------------------------------------------------------------===//12 13#include "ubsan_platform.h"14#if CAN_SANITIZE_UB15#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 22namespace __ubsan {23 24static const char *GetFlag(const char *flag) {25 // We cannot call getenv() from inside a preinit array initializer26 if (SANITIZER_CAN_USE_PREINIT_ARRAY) {27 return GetEnv(flag);28 } else {29 return getenv(flag);30 }31}32 33Flags ubsan_flags;34 35void Flags::SetDefaults() {36#define UBSAN_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue;37#include "ubsan_flags.inc"38#undef UBSAN_FLAG39}40 41void RegisterUbsanFlags(FlagParser *parser, Flags *f) {42#define UBSAN_FLAG(Type, Name, DefaultValue, Description) \43 RegisterFlag(parser, #Name, Description, &f->Name);44#include "ubsan_flags.inc"45#undef UBSAN_FLAG46}47 48void InitializeFlags() {49 SetCommonFlagsDefaults();50 {51 CommonFlags cf;52 cf.CopyFrom(*common_flags());53 cf.external_symbolizer_path = GetFlag("UBSAN_SYMBOLIZER_PATH");54 OverrideCommonFlags(cf);55 }56 57 Flags *f = flags();58 f->SetDefaults();59 60 FlagParser parser;61 RegisterCommonFlags(&parser);62 RegisterUbsanFlags(&parser, f);63 64 // Override from user-specified string.65 parser.ParseString(__ubsan_default_options());66 // Override from environment variable.67 parser.ParseStringFromEnv("UBSAN_OPTIONS");68 InitializeCommonFlags();69 if (Verbosity()) ReportUnrecognizedFlags();70 71 if (common_flags()->help) parser.PrintFlagDescriptions();72}73 74} // namespace __ubsan75 76SANITIZER_INTERFACE_WEAK_DEF(const char *, __ubsan_default_options, void) {77 return "";78}79 80#endif // CAN_SANITIZE_UB81