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_"