LLVM: lib/Transforms/Instrumentation/AddressSanitizer.cpp File Reference (original) (raw)

Go to the source code of this file.

Macros
#define DEBUG_TYPE "asan"
Functions
STATISTIC (NumInstrumentedReads, "Number of instrumented reads")
STATISTIC (NumInstrumentedWrites, "Number of instrumented writes")
STATISTIC (NumOptimizedAccessesToGlobalVar, "Number of optimized accesses to global vars")
STATISTIC (NumOptimizedAccessesToStackVar, "Number of optimized accesses to stack vars")
static ShadowMapping getShadowMapping (const Triple &TargetTriple, int LongSize, bool IsKasan)
static uint64_t getRedzoneSizeForScale (int MappingScale)
static uint64_t GetCtorAndDtorPriority (Triple &TargetTriple)
static Twine genName (StringRef suffix)
static size_t TypeStoreSizeToSizeIndex (uint32_t TypeSize)
static bool GlobalWasGeneratedByCompiler (GlobalVariable *G)
Check if G has been created by a trusted compiler pass.
static bool isUnsupportedAMDGPUAddrspace (Value *Addr)
static bool isSupportedAddrspace (const Triple &TargetTriple, Value *Addr)
static bool isPointerOperand (Value *V)
static bool isInterestingPointerComparison (Instruction *I)
static bool isInterestingPointerSubtraction (Instruction *I)
static void doInstrumentAddress (AddressSanitizer *Pass, Instruction *I, Instruction *InsertBefore, Value *Addr, MaybeAlign Alignment, unsigned Granularity, TypeSize TypeStoreSize, bool IsWrite, Value *SizeArgument, bool UseCalls, uint32_t Exp, RuntimeCallInserter &RTCI)
static int StackMallocSizeClass (uint64_t LocalStackSize)
static void findStoresToUninstrumentedArgAllocas (AddressSanitizer &ASan, Instruction &InsBefore, SmallVectorImpl< Instruction * > &InitInsts)
Collect instructions in the entry block after InsBefore which initialize permanent storage for a function argument.
static StringRef getAllocaName (AllocaInst *AI)
Variables
static const uint64_t kDefaultShadowScale = 3
static const uint64_t kDefaultShadowOffset32 = 1ULL << 29
static const uint64_t kDefaultShadowOffset64 = 1ULL << 44
static const uint64_t kDynamicShadowSentinel
static const uint64_t kSmallX86_64ShadowOffsetBase = 0x7FFFFFFF
static const uint64_t kSmallX86_64ShadowOffsetAlignMask = ~0xFFFULL
static const uint64_t kLinuxKasan_ShadowOffset64 = 0xdffffc0000000000
static const uint64_t kPPC64_ShadowOffset64 = 1ULL << 44
static const uint64_t kSystemZ_ShadowOffset64 = 1ULL << 52
static const uint64_t kMIPS_ShadowOffsetN32 = 1ULL << 29
static const uint64_t kMIPS32_ShadowOffset32 = 0x0aaa0000
static const uint64_t kMIPS64_ShadowOffset64 = 1ULL << 37
static const uint64_t kAArch64_ShadowOffset64 = 1ULL << 36
static const uint64_t kLoongArch64_ShadowOffset64 = 1ULL << 46
static const uint64_t kRISCV64_ShadowOffset64 = kDynamicShadowSentinel
static const uint64_t kFreeBSD_ShadowOffset32 = 1ULL << 30
static const uint64_t kFreeBSD_ShadowOffset64 = 1ULL << 46
static const uint64_t kFreeBSDAArch64_ShadowOffset64 = 1ULL << 47
static const uint64_t kFreeBSDKasan_ShadowOffset64 = 0xdffff7c000000000
static const uint64_t kNetBSD_ShadowOffset32 = 1ULL << 30
static const uint64_t kNetBSD_ShadowOffset64 = 1ULL << 46
static const uint64_t kNetBSDKasan_ShadowOffset64 = 0xdfff900000000000
static const uint64_t kPS_ShadowOffset64 = 1ULL << 40
static const uint64_t kWindowsShadowOffset32 = 3ULL << 28
static const uint64_t kWebAssemblyShadowOffset = 0
static const uint64_t kWindowsShadowOffset64 = kDynamicShadowSentinel
static const size_t kMinStackMallocSize = 1 << 6
static const size_t kMaxStackMallocSize = 1 << 16
static const uintptr_t kCurrentStackFrameMagic = 0x41B58AB3
static const uintptr_t kRetiredStackFrameMagic = 0x45E0360E
const char kAsanModuleCtorName [] = "asan.module_ctor"
const char kAsanModuleDtorName [] = "asan.module_dtor"
static const uint64_t kAsanCtorAndDtorPriority = 1
static const uint64_t kAsanEmscriptenCtorAndDtorPriority = 50
const char kAsanReportErrorTemplate [] = "__asan_report_"
const char kAsanRegisterGlobalsName [] = "__asan_register_globals"
const char kAsanUnregisterGlobalsName [] = "__asan_unregister_globals"
const char kAsanRegisterImageGlobalsName [] = "__asan_register_image_globals"
const char kAsanUnregisterImageGlobalsName []
const char kAsanRegisterElfGlobalsName [] = "__asan_register_elf_globals"
const char kAsanUnregisterElfGlobalsName [] = "__asan_unregister_elf_globals"
const char kAsanPoisonGlobalsName [] = "__asan_before_dynamic_init"
const char kAsanUnpoisonGlobalsName [] = "__asan_after_dynamic_init"
const char kAsanInitName [] = "__asan_init"
const char kAsanVersionCheckNamePrefix [] = "__asan_version_mismatch_check_v"
const char kAsanPtrCmp [] = "__sanitizer_ptr_cmp"
const char kAsanPtrSub [] = "__sanitizer_ptr_sub"
const char kAsanHandleNoReturnName [] = "__asan_handle_no_return"
static const int kMaxAsanStackMallocSizeClass = 10
const char kAsanStackMallocNameTemplate [] = "__asan_stack_malloc_"
const char kAsanStackMallocAlwaysNameTemplate []
const char kAsanStackFreeNameTemplate [] = "__asan_stack_free_"
const char kAsanGenPrefix [] = "___asan_gen_"
const char kODRGenPrefix [] = "__odr_asan_gen_"
const char kSanCovGenPrefix [] = "__sancov_gen_"
const char kAsanSetShadowPrefix [] = "__asan_set_shadow_"
const char kAsanPoisonStackMemoryName [] = "__asan_poison_stack_memory"
const char kAsanUnpoisonStackMemoryName [] = "__asan_unpoison_stack_memory"
const char kAsanGlobalsRegisteredFlagName [] = "___asan_globals_registered"
const char kAsanOptionDetectUseAfterReturn []
const char kAsanShadowMemoryDynamicAddress []
const char kAsanAllocaPoison [] = "__asan_alloca_poison"
const char kAsanAllocasUnpoison [] = "__asan_allocas_unpoison"
const char kAMDGPUAddressSharedName [] = "llvm.amdgcn.is.shared"
const char kAMDGPUAddressPrivateName [] = "llvm.amdgcn.is.private"
const char kAMDGPUBallotName [] = "llvm.amdgcn.ballot.i64"
const char kAMDGPUUnreachableName [] = "llvm.amdgcn.unreachable"
static const size_t kNumberOfAccessSizes = 5
static const uint64_t kAllocaRzSize = 32
constexpr size_t kCompileKernelShift = 0
constexpr size_t kCompileKernelMask = 0x1
constexpr size_t kAccessSizeIndexShift = 1
constexpr size_t kAccessSizeIndexMask = 0xf
constexpr size_t kIsWriteShift = 5
constexpr size_t kIsWriteMask = 0x1
static cl::opt< bool > ClEnableKasan ("asan-kernel", cl::desc("Enable KernelAddressSanitizer instrumentation"), cl::Hidden, cl::init(false))
static cl::opt< bool > ClRecover ("asan-recover", cl::desc("Enable recovery mode (continue-after-error)."), cl::Hidden, cl::init(false))
static cl::opt< bool > ClInsertVersionCheck ("asan-guard-against-version-mismatch", cl::desc("Guard against compiler/runtime version mismatch."), cl::Hidden, cl::init(true))
static cl::opt< bool > ClInstrumentReads ("asan-instrument-reads", cl::desc("instrument read instructions"), cl::Hidden, cl::init(true))
static cl::opt< bool > ClInstrumentWrites ("asan-instrument-writes", cl::desc("instrument write instructions"), cl::Hidden, cl::init(true))
static cl::opt< bool > ClUseStackSafety ("asan-use-stack-safety", cl::Hidden, cl::init(true), cl::Hidden, cl::desc("Use Stack Safety analysis results"), cl::Optional)
static cl::opt< bool > ClInstrumentAtomics ("asan-instrument-atomics", cl::desc("instrument atomic instructions (rmw, cmpxchg)"), cl::Hidden, cl::init(true))
static cl::opt< bool > ClInstrumentByval ("asan-instrument-byval", cl::desc("instrument byval call arguments"), cl::Hidden, cl::init(true))
static cl::opt< bool > ClAlwaysSlowPath ("asan-always-slow-path", cl::desc("use instrumentation with slow path for all accesses"), cl::Hidden, cl::init(false))
static cl::opt< bool > ClForceDynamicShadow ("asan-force-dynamic-shadow", cl::desc("Load shadow address into a local variable for each function"), cl::Hidden, cl::init(false))
static cl::opt< bool > ClWithIfunc ("asan-with-ifunc", cl::desc("Access dynamic shadow through an ifunc global on " "platforms that support this"), cl::Hidden, cl::init(true))
static cl::opt< int > ClShadowAddrSpace ("asan-shadow-addr-space", cl::desc("Address space for pointers to the shadow map"), cl::Hidden, cl::init(0))
static cl::opt< bool > ClWithIfuncSuppressRemat ("asan-with-ifunc-suppress-remat", cl::desc("Suppress rematerialization of dynamic shadow address by passing " "it through inline asm in prologue."), cl::Hidden, cl::init(true))
static cl::opt< int > ClMaxInsnsToInstrumentPerBB ("asan-max-ins-per-bb", cl::init(10000), cl::desc("maximal number of instructions to instrument in any given BB"), cl::Hidden)
static cl::opt< bool > ClStack ("asan-stack", cl::desc("Handle stack memory"), cl::Hidden, cl::init(true))
static cl::opt< uint32_t > ClMaxInlinePoisoningSize ("asan-max-inline-poisoning-size", cl::desc("Inline shadow poisoning for blocks up to the given size in bytes."), cl::Hidden, cl::init(64))
static cl::opt< AsanDetectStackUseAfterReturnMode > ClUseAfterReturn ("asan-use-after-return", cl::desc("Sets the mode of detection for stack-use-after-return."), cl::values(clEnumValN(AsanDetectStackUseAfterReturnMode::Never, "never", "Never detect stack use after return."), clEnumValN(AsanDetectStackUseAfterReturnMode::Runtime, "runtime", "Detect stack use after return if " "binary flag 'ASAN_OPTIONS=detect_stack_use_after_return' is set."), clEnumValN(AsanDetectStackUseAfterReturnMode::Always, "always", "Always detect stack use after return.")), cl::Hidden, cl::init(AsanDetectStackUseAfterReturnMode::Runtime))
static cl::opt< bool > ClRedzoneByvalArgs ("asan-redzone-byval-args", cl::desc("Create redzones for byval " "arguments (extra copy " "required)"), cl::Hidden, cl::init(true))
static cl::opt< bool > ClUseAfterScope ("asan-use-after-scope", cl::desc("Check stack-use-after-scope"), cl::Hidden, cl::init(false))
static cl::opt< bool > ClGlobals ("asan-globals", cl::desc("Handle global objects"), cl::Hidden, cl::init(true))
static cl::opt< bool > ClInitializers ("asan-initialization-order", cl::desc("Handle C++ initializer order"), cl::Hidden, cl::init(true))
static cl::opt< bool > ClInvalidPointerPairs ("asan-detect-invalid-pointer-pair", cl::desc("Instrument <, <=, >, >=, - with pointer operands"), cl::Hidden, cl::init(false))
static cl::opt< bool > ClInvalidPointerCmp ("asan-detect-invalid-pointer-cmp", cl::desc("Instrument <, <=, >, >= with pointer operands"), cl::Hidden, cl::init(false))
static cl::opt< bool > ClInvalidPointerSub ("asan-detect-invalid-pointer-sub", cl::desc("Instrument - operations with pointer operands"), cl::Hidden, cl::init(false))
static cl::opt< unsigned > ClRealignStack ("asan-realign-stack", cl::desc("Realign stack to the value of this flag (power of two)"), cl::Hidden, cl::init(32))
static cl::opt< int > ClInstrumentationWithCallsThreshold ("asan-instrumentation-with-call-threshold", cl::desc("If the function being instrumented contains more than " "this number of memory accesses, use callbacks instead of " "inline checks (-1 means never use callbacks)."), cl::Hidden, cl::init(7000))
static cl::opt< std::string > ClMemoryAccessCallbackPrefix ("asan-memory-access-callback-prefix", cl::desc("Prefix for memory access callbacks"), cl::Hidden, cl::init("__asan_"))
static cl::opt< bool > ClKasanMemIntrinCallbackPrefix ("asan-kernel-mem-intrinsic-prefix", cl::desc("Use prefix for memory intrinsics in KASAN mode"), cl::Hidden, cl::init(false))
static cl::opt< bool > ClInstrumentDynamicAllocas ("asan-instrument-dynamic-allocas", cl::desc("instrument dynamic allocas"), cl::Hidden, cl::init(true))
static cl::opt< bool > ClSkipPromotableAllocas ("asan-skip-promotable-allocas", cl::desc("Do not instrument promotable allocas"), cl::Hidden, cl::init(true))
static cl::opt< AsanCtorKind > ClConstructorKind ("asan-constructor-kind", cl::desc("Sets the ASan constructor kind"), cl::values(clEnumValN(AsanCtorKind::None, "none", "No constructors"), clEnumValN(AsanCtorKind::Global, "global", "Use global constructors")), cl::init(AsanCtorKind::Global), cl::Hidden)
static cl::opt< int > ClMappingScale ("asan-mapping-scale", cl::desc("scale of asan shadow mapping"), cl::Hidden, cl::init(0))
static cl::opt< uint64_t > ClMappingOffset ("asan-mapping-offset", cl::desc("offset of asan shadow mapping [EXPERIMENTAL]"), cl::Hidden, cl::init(0))
static cl::opt< bool > ClOpt ("asan-opt", cl::desc("Optimize instrumentation"), cl::Hidden, cl::init(true))
static cl::opt< bool > ClOptimizeCallbacks ("asan-optimize-callbacks", cl::desc("Optimize callbacks"), cl::Hidden, cl::init(false))
static cl::opt< bool > ClOptSameTemp ("asan-opt-same-temp", cl::desc("Instrument the same temp just once"), cl::Hidden, cl::init(true))
static cl::opt< bool > ClOptGlobals ("asan-opt-globals", cl::desc("Don't instrument scalar globals"), cl::Hidden, cl::init(true))
static cl::opt< bool > ClOptStack ("asan-opt-stack", cl::desc("Don't instrument scalar stack variables"), cl::Hidden, cl::init(false))
static cl::opt< bool > ClDynamicAllocaStack ("asan-stack-dynamic-alloca", cl::desc("Use dynamic alloca to represent stack variables"), cl::Hidden, cl::init(true))
static cl::opt< uint32_t > ClForceExperiment ("asan-force-experiment", cl::desc("Force optimization experiment (for testing)"), cl::Hidden, cl::init(0))
static cl::opt< bool > ClUsePrivateAlias ("asan-use-private-alias", cl::desc("Use private aliases for global variables"), cl::Hidden, cl::init(true))
static cl::opt< bool > ClUseOdrIndicator ("asan-use-odr-indicator", cl::desc("Use odr indicators to improve ODR reporting"), cl::Hidden, cl::init(true))
static cl::opt< bool > ClUseGlobalsGC ("asan-globals-live-support", cl::desc("Use linker features to support dead " "code stripping of globals"), cl::Hidden, cl::init(true))
static cl::opt< bool > ClWithComdat ("asan-with-comdat", cl::desc("Place ASan constructors in comdat sections"), cl::Hidden, cl::init(true))
static cl::opt< AsanDtorKind > ClOverrideDestructorKind ("asan-destructor-kind", cl::desc("Sets the ASan destructor kind. The default is to use the value " "provided to the pass constructor"), cl::values(clEnumValN(AsanDtorKind::None, "none", "No destructors"), clEnumValN(AsanDtorKind::Global, "global", "Use global destructors")), cl::init(AsanDtorKind::Invalid), cl::Hidden)
static SmallSet< unsigned, 8 > SrcAddrSpaces
static cl::list< unsigned > ClAddrSpaces ("asan-instrument-address-spaces", cl::desc("Only instrument variables in the specified address spaces."), cl::Hidden, cl::CommaSeparated, cl::ZeroOrMore, cl::callback([](const unsigned &AddrSpace) { SrcAddrSpaces.insert(AddrSpace);}))
static cl::opt< int > ClDebug ("asan-debug", cl::desc("debug"), cl::Hidden, cl::init(0))
static cl::opt< int > ClDebugStack ("asan-debug-stack", cl::desc("debug stack"), cl::Hidden, cl::init(0))
static cl::opt< std::string > ClDebugFunc ("asan-debug-func", cl::Hidden, cl::desc("Debug func"))
static cl::opt< int > ClDebugMin ("asan-debug-min", cl::desc("Debug min inst"), cl::Hidden, cl::init(-1))
static cl::opt< int > ClDebugMax ("asan-debug-max", cl::desc("Debug max inst"), cl::Hidden, cl::init(-1))

DEBUG_TYPE

#define DEBUG_TYPE "asan"

doInstrumentAddress()

void doInstrumentAddress ( AddressSanitizer * Pass, Instruction * I, Instruction * InsertBefore, Value * Addr, MaybeAlign Alignment, unsigned Granularity, TypeSize TypeStoreSize, bool IsWrite, Value * SizeArgument, bool UseCalls, uint32_t Exp, RuntimeCallInserter & RTCI ) static

findStoresToUninstrumentedArgAllocas()

genName()

getAllocaName()

GetCtorAndDtorPriority()

getRedzoneSizeForScale()

uint64_t getRedzoneSizeForScale ( int MappingScale) static

getShadowMapping()

ShadowMapping getShadowMapping ( const Triple & TargetTriple, int LongSize, bool IsKasan ) static

Definition at line 494 of file AddressSanitizer.cpp.

References llvm::Triple::aarch64, llvm::Triple::aarch64_be, ClForceDynamicShadow, ClMappingOffset, ClMappingScale, ClWithIfunc, llvm::Triple::getArch(), llvm::Triple::isABIN32(), llvm::Triple::isAMDGPU(), llvm::Triple::isAndroid(), llvm::Triple::isARM(), llvm::Triple::isBPF(), llvm::Triple::isDriverKit(), llvm::Triple::isiOS(), llvm::Triple::isLoongArch64(), llvm::Triple::isMacOSX(), llvm::Triple::isMIPS32(), llvm::Triple::isMIPS64(), llvm::Triple::isOSFreeBSD(), llvm::Triple::isOSFuchsia(), llvm::Triple::isOSHaiku(), llvm::Triple::isOSLinux(), llvm::Triple::isOSNetBSD(), llvm::Triple::isOSWindows(), llvm::Triple::isPS(), llvm::Triple::isThumb(), llvm::Triple::isWasm(), llvm::Triple::isWatchOS(), kAArch64_ShadowOffset64, kDefaultShadowOffset32, kDefaultShadowOffset64, kDefaultShadowScale, kDynamicShadowSentinel, kFreeBSD_ShadowOffset32, kFreeBSD_ShadowOffset64, kFreeBSDAArch64_ShadowOffset64, kFreeBSDKasan_ShadowOffset64, kLinuxKasan_ShadowOffset64, kLoongArch64_ShadowOffset64, kMIPS32_ShadowOffset32, kMIPS64_ShadowOffset64, kMIPS_ShadowOffsetN32, kNetBSD_ShadowOffset32, kNetBSD_ShadowOffset64, kNetBSDKasan_ShadowOffset64, kPPC64_ShadowOffset64, kPS_ShadowOffset64, kRISCV64_ShadowOffset64, kSmallX86_64ShadowOffsetAlignMask, kSmallX86_64ShadowOffsetBase, kSystemZ_ShadowOffset64, kWebAssemblyShadowOffset, kWindowsShadowOffset32, kWindowsShadowOffset64, llvm::Triple::ppc64, llvm::Triple::ppc64le, llvm::Triple::riscv64, llvm::Triple::systemz, and llvm::Triple::x86_64.

Referenced by llvm::getAddressSanitizerParams().

GlobalWasGeneratedByCompiler()

isInterestingPointerComparison()

isInterestingPointerSubtraction()

isPointerOperand()

isSupportedAddrspace()

isUnsupportedAMDGPUAddrspace()

bool isUnsupportedAMDGPUAddrspace ( Value * Addr) static

StackMallocSizeClass()

int StackMallocSizeClass ( uint64_t LocalStackSize) static

STATISTIC() [1/4]

STATISTIC ( NumInstrumentedReads ,
"Number of instrumented reads" )

STATISTIC() [2/4]

STATISTIC ( NumInstrumentedWrites ,
"Number of instrumented writes" )

STATISTIC() [3/4]

STATISTIC ( NumOptimizedAccessesToGlobalVar ,
"Number of optimized accesses to global vars" )

STATISTIC() [4/4]

STATISTIC ( NumOptimizedAccessesToStackVar ,
"Number of optimized accesses to stack vars" )

TypeStoreSizeToSizeIndex()

size_t TypeStoreSizeToSizeIndex ( uint32_t TypeSize) static

ClAddrSpaces

cl::list< unsigned > ClAddrSpaces("asan-instrument-address-spaces", cl::desc("Only instrument variables in the specified address spaces."), cl::Hidden, cl::CommaSeparated, cl::ZeroOrMore, cl::callback([](const unsigned &AddrSpace) { SrcAddrSpaces.insert(AddrSpace); })) ( "asan-instrument-address-spaces" , cl::desc("Only instrument variables in the specified address spaces.") , cl::Hidden , cl::CommaSeparated , cl::ZeroOrMore , cl::callback([](const unsigned &AddrSpace) { SrcAddrSpaces.insert(AddrSpace); }) ) static

ClAlwaysSlowPath

ClConstructorKind

cl::opt< AsanCtorKind > ClConstructorKind("asan-constructor-kind", cl::desc("Sets the ASan constructor kind"), cl::values(clEnumValN(AsanCtorKind::None, "none", "No constructors"), clEnumValN(AsanCtorKind::Global, "global", "Use global constructors")), cl::init(AsanCtorKind::Global), cl::Hidden) ( "asan-constructor-kind" , cl::desc("Sets the ASan constructor kind") , cl::values(clEnumValN(AsanCtorKind::None, "none", "No constructors"), clEnumValN(AsanCtorKind::Global, "global", "Use global constructors")) , cl::init(AsanCtorKind::Global) , cl::Hidden ) static

ClDebug

cl::opt< int > ClDebug("asan-debug", cl::desc("debug"), cl::Hidden, cl::init(0)) ( "asan-debug" , cl::desc("debug") , cl::Hidden , cl::init(0) ) static

ClDebugFunc

ClDebugMax

cl::opt< int > ClDebugMax("asan-debug-max", cl::desc("Debug max inst"), cl::Hidden, cl::init(-1)) ( "asan-debug-max" , cl::desc("Debug max inst") , cl::Hidden , cl::init(-1) ) static

ClDebugMin

cl::opt< int > ClDebugMin("asan-debug-min", cl::desc("Debug min inst"), cl::Hidden, cl::init(-1)) ( "asan-debug-min" , cl::desc("Debug min inst") , cl::Hidden , cl::init(-1) ) static

ClDebugStack

cl::opt< int > ClDebugStack("asan-debug-stack", cl::desc("debug stack"), cl::Hidden, cl::init(0)) ( "asan-debug-stack" , cl::desc("debug stack") , cl::Hidden , cl::init(0) ) static

ClDynamicAllocaStack

cl::opt< bool > ClDynamicAllocaStack("asan-stack-dynamic-alloca", cl::desc("Use dynamic alloca to represent stack variables"), cl::Hidden, cl::init(true)) ( "asan-stack-dynamic-alloca" , cl::desc("Use dynamic alloca to represent stack variables") , cl::Hidden , cl::init(true) ) static

ClEnableKasan

cl::opt< bool > ClEnableKasan("asan-kernel", cl::desc("Enable KernelAddressSanitizer instrumentation"), cl::Hidden, cl::init(false)) ( "asan-kernel" , cl::desc("Enable KernelAddressSanitizer instrumentation") , cl::Hidden , cl::init(false) ) static

ClForceDynamicShadow

cl::opt< bool > ClForceDynamicShadow("asan-force-dynamic-shadow", cl::desc("Load shadow address into a local variable for each function"), cl::Hidden, cl::init(false)) ( "asan-force-dynamic-shadow" , cl::desc("Load shadow address into a local variable for each function") , cl::Hidden , cl::init(false) ) static

ClForceExperiment

ClGlobals

cl::opt< bool > ClGlobals("asan-globals", cl::desc("Handle global objects"), cl::Hidden, cl::init(true)) ( "asan-globals" , cl::desc("Handle global objects") , cl::Hidden , cl::init(true) ) static

ClInitializers

cl::opt< bool > ClInitializers("asan-initialization-order", cl::desc("Handle C++ initializer order"), cl::Hidden, cl::init(true)) ( "asan-initialization-order" , cl::desc("Handle C++ initializer order") , cl::Hidden , cl::init(true) ) static

ClInsertVersionCheck

cl::opt< bool > ClInsertVersionCheck("asan-guard-against-version-mismatch", cl::desc("Guard against compiler/runtime version mismatch."), cl::Hidden, cl::init(true)) ( "asan-guard-against-version-mismatch" , cl::desc("Guard against compiler/runtime version mismatch.") , cl::Hidden , cl::init(true) ) static

ClInstrumentationWithCallsThreshold

ClInstrumentAtomics

ClInstrumentByval

cl::opt< bool > ClInstrumentByval("asan-instrument-byval", cl::desc("instrument byval call arguments"), cl::Hidden, cl::init(true)) ( "asan-instrument-byval" , cl::desc("instrument byval call arguments") , cl::Hidden , cl::init(true) ) static

ClInstrumentDynamicAllocas

cl::opt< bool > ClInstrumentDynamicAllocas("asan-instrument-dynamic-allocas", cl::desc("instrument dynamic allocas"), cl::Hidden, cl::init(true)) ( "asan-instrument-dynamic-allocas" , cl::desc("instrument dynamic allocas") , cl::Hidden , cl::init(true) ) static

ClInstrumentReads

cl::opt< bool > ClInstrumentReads("asan-instrument-reads", cl::desc("instrument read instructions"), cl::Hidden, cl::init(true)) ( "asan-instrument-reads" , cl::desc("instrument read instructions") , cl::Hidden , cl::init(true) ) static

ClInstrumentWrites

ClInvalidPointerCmp

cl::opt< bool > ClInvalidPointerCmp("asan-detect-invalid-pointer-cmp", cl::desc("Instrument <, <=, >, >= with pointer operands"), cl::Hidden, cl::init(false)) ( "asan-detect-invalid-pointer-cmp" , cl::desc("Instrument <, <=, >, >= with pointer operands") , cl::Hidden , cl::init(false) ) static

ClInvalidPointerPairs

cl::opt< bool > ClInvalidPointerPairs("asan-detect-invalid-pointer-pair", cl::desc("Instrument <, <=, >, >=, - with pointer operands"), cl::Hidden, cl::init(false)) ( "asan-detect-invalid-pointer-pair" , cl::desc("Instrument <, <=, >, >=, - with pointer operands") , cl::Hidden , cl::init(false) ) static

ClInvalidPointerSub

cl::opt< bool > ClInvalidPointerSub("asan-detect-invalid-pointer-sub", cl::desc("Instrument - operations with pointer operands"), cl::Hidden, cl::init(false)) ( "asan-detect-invalid-pointer-sub" , cl::desc("Instrument - operations with pointer operands") , cl::Hidden , cl::init(false) ) static

ClKasanMemIntrinCallbackPrefix

cl::opt< bool > ClKasanMemIntrinCallbackPrefix("asan-kernel-mem-intrinsic-prefix", cl::desc("Use prefix for memory intrinsics in KASAN mode"), cl::Hidden, cl::init(false)) ( "asan-kernel-mem-intrinsic-prefix" , cl::desc("Use prefix for memory intrinsics in KASAN mode") , cl::Hidden , cl::init(false) ) static

ClMappingOffset

cl::opt< uint64_t > ClMappingOffset("asan-mapping-offset", cl::desc("offset of asan shadow mapping [EXPERIMENTAL]"), cl::Hidden, cl::init(0)) ( "asan-mapping-offset" , cl::desc("offset of asan shadow mapping [EXPERIMENTAL]") , cl::Hidden , cl::init(0) ) static

ClMappingScale

cl::opt< int > ClMappingScale("asan-mapping-scale", cl::desc("scale of asan shadow mapping"), cl::Hidden, cl::init(0)) ( "asan-mapping-scale" , cl::desc("scale of asan shadow mapping") , cl::Hidden , cl::init(0) ) static

ClMaxInlinePoisoningSize

cl::opt< uint32_t > ClMaxInlinePoisoningSize("asan-max-inline-poisoning-size", cl::desc( "Inline shadow poisoning for blocks up to the given size in bytes."), cl::Hidden, cl::init(64)) ( "asan-max-inline-poisoning-size" , cl::desc( "Inline shadow poisoning for blocks up to the given size in bytes.") , cl::Hidden , cl::init(64) ) static

ClMaxInsnsToInstrumentPerBB

ClMemoryAccessCallbackPrefix

cl::opt< std::string > ClMemoryAccessCallbackPrefix("asan-memory-access-callback-prefix", cl::desc("Prefix for memory access callbacks"), cl::Hidden, cl::init("__asan_")) ( "asan-memory-access-callback-prefix" , cl::desc("Prefix for memory access callbacks") , cl::Hidden , cl::init("__asan_") ) static

ClOpt

cl::opt< bool > ClOpt("asan-opt", cl::desc("Optimize instrumentation"), cl::Hidden, cl::init(true)) ( "asan-opt" , cl::desc("Optimize instrumentation") , cl::Hidden , cl::init(true) ) static

ClOptGlobals

ClOptimizeCallbacks

cl::opt< bool > ClOptimizeCallbacks("asan-optimize-callbacks", cl::desc("Optimize callbacks"), cl::Hidden, cl::init(false)) ( "asan-optimize-callbacks" , cl::desc("Optimize callbacks") , cl::Hidden , cl::init(false) ) static

ClOptSameTemp

cl::opt< bool > ClOptSameTemp("asan-opt-same-temp", cl::desc("Instrument the same temp just once"), cl::Hidden, cl::init(true)) ( "asan-opt-same-temp" , cl::desc("Instrument the same temp just once") , cl::Hidden , cl::init(true) ) static

ClOptStack

ClOverrideDestructorKind

cl::opt< AsanDtorKind > ClOverrideDestructorKind("asan-destructor-kind", cl::desc("Sets the ASan destructor kind. The default is to use the value " "provided to the pass constructor"), cl::values(clEnumValN(AsanDtorKind::None, "none", "No destructors"), clEnumValN(AsanDtorKind::Global, "global", "Use global destructors")), cl::init(AsanDtorKind::Invalid), cl::Hidden) ( "asan-destructor-kind" , cl::desc("Sets the ASan destructor kind. The default is to use the value " "provided to the pass constructor") , cl::values(clEnumValN(AsanDtorKind::None, "none", "No destructors"), clEnumValN(AsanDtorKind::Global, "global", "Use global destructors")) , cl::init(AsanDtorKind::Invalid) , cl::Hidden ) static

ClRealignStack

cl::opt< unsigned > ClRealignStack("asan-realign-stack", cl::desc("Realign stack to the value of this flag (power of two)"), cl::Hidden, cl::init(32)) ( "asan-realign-stack" , cl::desc("Realign stack to the value of this flag (power of two)") , cl::Hidden , cl::init(32) ) static

ClRecover

cl::opt< bool > ClRecover("asan-recover", cl::desc("Enable recovery mode (continue-after-error)."), cl::Hidden, cl::init(false)) ( "asan-recover" , cl::desc("Enable recovery mode (continue-after-error).") , cl::Hidden , cl::init(false) ) static

ClRedzoneByvalArgs

cl::opt< bool > ClRedzoneByvalArgs("asan-redzone-byval-args", cl::desc("Create redzones for byval " "arguments (extra copy " "required)"), cl::Hidden, cl::init(true)) ( "asan-redzone-byval-args" , cl::desc("Create redzones for byval " "arguments (extra copy " "required)") , cl::Hidden , cl::init(true) ) static

ClShadowAddrSpace

cl::opt< int > ClShadowAddrSpace("asan-shadow-addr-space", cl::desc("Address space for pointers to the shadow map"), cl::Hidden, cl::init(0)) ( "asan-shadow-addr-space" , cl::desc("Address space for pointers to the shadow map") , cl::Hidden , cl::init(0) ) static

ClSkipPromotableAllocas

ClStack

cl::opt< bool > ClStack("asan-stack", cl::desc("Handle stack memory"), cl::Hidden, cl::init(true)) ( "asan-stack" , cl::desc("Handle stack memory") , cl::Hidden , cl::init(true) ) static

ClUseAfterReturn

cl::opt< AsanDetectStackUseAfterReturnMode > ClUseAfterReturn("asan-use-after-return", cl::desc("Sets the mode of detection for stack-use-after-return."), cl::values( clEnumValN(AsanDetectStackUseAfterReturnMode::Never, "never", "Never detect stack use after return."), clEnumValN( AsanDetectStackUseAfterReturnMode::Runtime, "runtime", "Detect stack use after return if " "binary flag 'ASAN_OPTIONS=detect_stack_use_after_return' is set."), clEnumValN(AsanDetectStackUseAfterReturnMode::Always, "always", "Always detect stack use after return.")), cl::Hidden, cl::init(AsanDetectStackUseAfterReturnMode::Runtime)) ( "asan-use-after-return" , cl::desc("Sets the mode of detection for stack-use-after-return.") , cl::values( clEnumValN(AsanDetectStackUseAfterReturnMode::Never, "never", "Never detect stack use after return."), clEnumValN( AsanDetectStackUseAfterReturnMode::Runtime, "runtime", "Detect stack use after return if " "binary flag 'ASAN_OPTIONS=detect_stack_use_after_return' is set."), clEnumValN(AsanDetectStackUseAfterReturnMode::Always, "always", "Always detect stack use after return.")) , cl::Hidden , cl::init(AsanDetectStackUseAfterReturnMode::Runtime) ) static

ClUseAfterScope

cl::opt< bool > ClUseAfterScope("asan-use-after-scope", cl::desc("Check stack-use-after-scope"), cl::Hidden, cl::init(false)) ( "asan-use-after-scope" , cl::desc("Check stack-use-after-scope") , cl::Hidden , cl::init(false) ) static

ClUseGlobalsGC

cl::opt< bool > ClUseGlobalsGC("asan-globals-live-support", cl::desc("Use linker features to support dead " "code stripping of globals"), cl::Hidden, cl::init(true)) ( "asan-globals-live-support" , cl::desc("Use linker features to support dead " "code stripping of globals") , cl::Hidden , cl::init(true) ) static

ClUseOdrIndicator

cl::opt< bool > ClUseOdrIndicator("asan-use-odr-indicator", cl::desc("Use odr indicators to improve ODR reporting"), cl::Hidden, cl::init(true)) ( "asan-use-odr-indicator" , cl::desc("Use odr indicators to improve ODR reporting") , cl::Hidden , cl::init(true) ) static

ClUsePrivateAlias

cl::opt< bool > ClUsePrivateAlias("asan-use-private-alias", cl::desc("Use private aliases for global variables"), cl::Hidden, cl::init(true)) ( "asan-use-private-alias" , cl::desc("Use private aliases for global variables") , cl::Hidden , cl::init(true) ) static

ClUseStackSafety

cl::opt< bool > ClUseStackSafety("asan-use-stack-safety", cl::Hidden, cl::init(true), cl::Hidden, cl::desc("Use Stack Safety analysis results"), cl::Optional) ( "asan-use-stack-safety" , cl::Hidden , cl::init(true) , cl::Hidden , cl::desc("Use Stack Safety analysis results") , cl::Optional ) static

ClWithComdat

cl::opt< bool > ClWithComdat("asan-with-comdat", cl::desc("Place ASan constructors in comdat sections"), cl::Hidden, cl::init(true)) ( "asan-with-comdat" , cl::desc("Place ASan constructors in comdat sections") , cl::Hidden , cl::init(true) ) static

ClWithIfunc

cl::opt< bool > ClWithIfunc("asan-with-ifunc", cl::desc("Access dynamic shadow through an ifunc global on " "platforms that support this"), cl::Hidden, cl::init(true)) ( "asan-with-ifunc" , cl::desc("Access dynamic shadow through an ifunc global on " "platforms that support this") , cl::Hidden , cl::init(true) ) static

ClWithIfuncSuppressRemat

cl::opt< bool > ClWithIfuncSuppressRemat("asan-with-ifunc-suppress-remat", cl::desc("Suppress rematerialization of dynamic shadow address by passing " "it through inline asm in prologue."), cl::Hidden, cl::init(true)) ( "asan-with-ifunc-suppress-remat" , cl::desc("Suppress rematerialization of dynamic shadow address by passing " "it through inline asm in prologue.") , cl::Hidden , cl::init(true) ) static

kAArch64_ShadowOffset64

kAccessSizeIndexMask

size_t kAccessSizeIndexMask = 0xf constexpr

kAccessSizeIndexShift

size_t kAccessSizeIndexShift = 1 constexpr

kAllocaRzSize

kAMDGPUAddressPrivateName

const char kAMDGPUAddressPrivateName[] = "llvm.amdgcn.is.private"

kAMDGPUAddressSharedName

const char kAMDGPUAddressSharedName[] = "llvm.amdgcn.is.shared"

kAMDGPUBallotName

const char kAMDGPUBallotName[] = "llvm.amdgcn.ballot.i64"

kAMDGPUUnreachableName

const char kAMDGPUUnreachableName[] = "llvm.amdgcn.unreachable"

kAsanAllocaPoison

const char kAsanAllocaPoison[] = "__asan_alloca_poison"

kAsanAllocasUnpoison

const char kAsanAllocasUnpoison[] = "__asan_allocas_unpoison"

kAsanCtorAndDtorPriority

kAsanEmscriptenCtorAndDtorPriority

kAsanGenPrefix

kAsanGlobalsRegisteredFlagName

const char kAsanGlobalsRegisteredFlagName[] = "___asan_globals_registered"

kAsanHandleNoReturnName

const char kAsanHandleNoReturnName[] = "__asan_handle_no_return"

kAsanInitName

kAsanModuleCtorName

const char kAsanModuleCtorName[] = "asan.module_ctor"

kAsanModuleDtorName

const char kAsanModuleDtorName[] = "asan.module_dtor"

kAsanOptionDetectUseAfterReturn

kAsanPoisonGlobalsName

const char kAsanPoisonGlobalsName[] = "__asan_before_dynamic_init"

kAsanPoisonStackMemoryName

const char kAsanPoisonStackMemoryName[] = "__asan_poison_stack_memory"

kAsanPtrCmp

const char kAsanPtrCmp[] = "__sanitizer_ptr_cmp"

kAsanPtrSub

const char kAsanPtrSub[] = "__sanitizer_ptr_sub"

kAsanRegisterElfGlobalsName

const char kAsanRegisterElfGlobalsName[] = "__asan_register_elf_globals"

kAsanRegisterGlobalsName

const char kAsanRegisterGlobalsName[] = "__asan_register_globals"

kAsanRegisterImageGlobalsName

const char kAsanRegisterImageGlobalsName[] = "__asan_register_image_globals"

kAsanReportErrorTemplate

const char kAsanReportErrorTemplate[] = "__asan_report_"

kAsanSetShadowPrefix

const char kAsanSetShadowPrefix[] = "__asan_set_shadow_"

kAsanShadowMemoryDynamicAddress

kAsanStackFreeNameTemplate

const char kAsanStackFreeNameTemplate[] = "__asan_stack_free_"

kAsanStackMallocAlwaysNameTemplate

const char kAsanStackMallocAlwaysNameTemplate[]

kAsanStackMallocNameTemplate

const char kAsanStackMallocNameTemplate[] = "__asan_stack_malloc_"

kAsanUnpoisonGlobalsName

const char kAsanUnpoisonGlobalsName[] = "__asan_after_dynamic_init"

kAsanUnpoisonStackMemoryName

const char kAsanUnpoisonStackMemoryName[] = "__asan_unpoison_stack_memory"

kAsanUnregisterElfGlobalsName

const char kAsanUnregisterElfGlobalsName[] = "__asan_unregister_elf_globals"

kAsanUnregisterGlobalsName

const char kAsanUnregisterGlobalsName[] = "__asan_unregister_globals"

kAsanUnregisterImageGlobalsName

kAsanVersionCheckNamePrefix

const char kAsanVersionCheckNamePrefix[] = "__asan_version_mismatch_check_v"

kCompileKernelMask

size_t kCompileKernelMask = 0x1 constexpr

kCompileKernelShift

size_t kCompileKernelShift = 0 constexpr

kCurrentStackFrameMagic

const uintptr_t kCurrentStackFrameMagic = 0x41B58AB3 static

kDefaultShadowOffset32

kDefaultShadowOffset64

kDefaultShadowScale

kDynamicShadowSentinel

kFreeBSD_ShadowOffset32

kFreeBSD_ShadowOffset64

kFreeBSDAArch64_ShadowOffset64

kFreeBSDKasan_ShadowOffset64

kIsWriteMask

size_t kIsWriteMask = 0x1 constexpr

kIsWriteShift

kLinuxKasan_ShadowOffset64

kLoongArch64_ShadowOffset64

kMaxAsanStackMallocSizeClass

const int kMaxAsanStackMallocSizeClass = 10 static

kMaxStackMallocSize

const size_t kMaxStackMallocSize = 1 << 16 static

kMinStackMallocSize

const size_t kMinStackMallocSize = 1 << 6 static

kMIPS32_ShadowOffset32

kMIPS64_ShadowOffset64

kMIPS_ShadowOffsetN32

kNetBSD_ShadowOffset32

kNetBSD_ShadowOffset64

kNetBSDKasan_ShadowOffset64

kNumberOfAccessSizes

const size_t kNumberOfAccessSizes = 5 static

kODRGenPrefix

const char kODRGenPrefix[] = "__odr_asan_gen_"

kPPC64_ShadowOffset64

kPS_ShadowOffset64

kRetiredStackFrameMagic

const uintptr_t kRetiredStackFrameMagic = 0x45E0360E static

kRISCV64_ShadowOffset64

kSanCovGenPrefix

const char kSanCovGenPrefix[] = "__sancov_gen_"

kSmallX86_64ShadowOffsetAlignMask

kSmallX86_64ShadowOffsetBase

kSystemZ_ShadowOffset64

kWebAssemblyShadowOffset

kWindowsShadowOffset32

kWindowsShadowOffset64

SrcAddrSpaces