Path: blob/main/contrib/llvm-project/compiler-rt/lib/ubsan/ubsan_flags.cpp
35233 views
//===-- ubsan_flags.cpp ---------------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// Runtime flags for UndefinedBehaviorSanitizer.9//10//===----------------------------------------------------------------------===//1112#include "ubsan_platform.h"13#if CAN_SANITIZE_UB14#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"1819#include <stdlib.h>2021namespace __ubsan {2223static const char *GetFlag(const char *flag) {24// We cannot call getenv() from inside a preinit array initializer25if (SANITIZER_CAN_USE_PREINIT_ARRAY) {26return GetEnv(flag);27} else {28return getenv(flag);29}30}3132Flags ubsan_flags;3334void Flags::SetDefaults() {35#define UBSAN_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue;36#include "ubsan_flags.inc"37#undef UBSAN_FLAG38}3940void RegisterUbsanFlags(FlagParser *parser, Flags *f) {41#define UBSAN_FLAG(Type, Name, DefaultValue, Description) \42RegisterFlag(parser, #Name, Description, &f->Name);43#include "ubsan_flags.inc"44#undef UBSAN_FLAG45}4647void InitializeFlags() {48SetCommonFlagsDefaults();49{50CommonFlags cf;51cf.CopyFrom(*common_flags());52cf.external_symbolizer_path = GetFlag("UBSAN_SYMBOLIZER_PATH");53OverrideCommonFlags(cf);54}5556Flags *f = flags();57f->SetDefaults();5859FlagParser parser;60RegisterCommonFlags(&parser);61RegisterUbsanFlags(&parser, f);6263// Override from user-specified string.64parser.ParseString(__ubsan_default_options());65// Override from environment variable.66parser.ParseStringFromEnv("UBSAN_OPTIONS");67InitializeCommonFlags();68if (Verbosity()) ReportUnrecognizedFlags();6970if (common_flags()->help) parser.PrintFlagDescriptions();71}7273} // namespace __ubsan7475SANITIZER_INTERFACE_WEAK_DEF(const char *, __ubsan_default_options, void) {76return "";77}7879#endif // CAN_SANITIZE_UB808182