003 File Manager
Current Path:
/usr/src/contrib/llvm-project/compiler-rt/lib/asan
usr
/
src
/
contrib
/
llvm-project
/
compiler-rt
/
lib
/
asan
/
📁
..
📄
README.txt
(924 B)
📄
asan.syms.extra
(39 B)
📄
asan_activation.cpp
(4.55 KB)
📄
asan_activation.h
(736 B)
📄
asan_activation_flags.inc
(1.42 KB)
📄
asan_allocator.cpp
(40.63 KB)
📄
asan_allocator.h
(8.05 KB)
📄
asan_blacklist.txt
(513 B)
📄
asan_debugging.cpp
(4.7 KB)
📄
asan_descriptions.cpp
(16.44 KB)
📄
asan_descriptions.h
(7.59 KB)
📄
asan_errors.cpp
(21.78 KB)
📄
asan_errors.h
(14.75 KB)
📄
asan_fake_stack.cpp
(10.82 KB)
📄
asan_fake_stack.h
(6.89 KB)
📄
asan_flags.cpp
(7.32 KB)
📄
asan_flags.h
(1.45 KB)
📄
asan_flags.inc
(7.92 KB)
📄
asan_fuchsia.cpp
(8.18 KB)
📄
asan_globals.cpp
(16.98 KB)
📄
asan_globals_win.cpp
(2.03 KB)
📄
asan_init_version.h
(1.88 KB)
📄
asan_interceptors.cpp
(23.89 KB)
📄
asan_interceptors.h
(4.86 KB)
📄
asan_interceptors_memintrinsics.cpp
(1.52 KB)
📄
asan_interceptors_memintrinsics.h
(8.12 KB)
📄
asan_interceptors_vfork.S
(526 B)
📄
asan_interface.inc
(7.25 KB)
📄
asan_interface_internal.h
(10.88 KB)
📄
asan_internal.h
(5.95 KB)
📄
asan_linux.cpp
(7.45 KB)
📄
asan_lock.h
(0 B)
📄
asan_mac.cpp
(11.64 KB)
📄
asan_malloc_linux.cpp
(9.8 KB)
📄
asan_malloc_local.h
(1.92 KB)
📄
asan_malloc_mac.cpp
(3.83 KB)
📄
asan_malloc_win.cpp
(19.55 KB)
📄
asan_mapping.h
(14.72 KB)
📄
asan_mapping_myriad.h
(2.11 KB)
📄
asan_mapping_sparc64.h
(2.95 KB)
📄
asan_memory_profile.cpp
(4.12 KB)
📄
asan_new_delete.cpp
(8.16 KB)
📄
asan_poisoning.cpp
(16 KB)
📄
asan_poisoning.h
(3.85 KB)
📄
asan_posix.cpp
(4.12 KB)
📄
asan_preinit.cpp
(1 KB)
📄
asan_premap_shadow.cpp
(2.7 KB)
📄
asan_premap_shadow.h
(913 B)
📄
asan_report.cpp
(20.2 KB)
📄
asan_report.h
(4.59 KB)
📄
asan_rtems.cpp
(8.9 KB)
📄
asan_rtl.cpp
(22.99 KB)
📄
asan_scariness_score.h
(2.25 KB)
📄
asan_shadow_setup.cpp
(6.2 KB)
📄
asan_stack.cpp
(2.28 KB)
📄
asan_stack.h
(3.29 KB)
📄
asan_stats.cpp
(5.62 KB)
📄
asan_stats.h
(2.05 KB)
📄
asan_suppressions.cpp
(3.62 KB)
📄
asan_suppressions.h
(1.01 KB)
📄
asan_thread.cpp
(18.01 KB)
📄
asan_thread.h
(5.56 KB)
📄
asan_win.cpp
(13.74 KB)
📄
asan_win_dll_thunk.cpp
(5.12 KB)
📄
asan_win_dynamic_runtime_thunk.cpp
(5.4 KB)
📄
asan_win_weak_interception.cpp
(1.14 KB)
📄
weak_symbols.txt
(268 B)
Editing: asan_descriptions.h
//===-- asan_descriptions.h -------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file is a part of AddressSanitizer, an address sanity checker. // // ASan-private header for asan_descriptions.cpp. // TODO(filcab): Most struct definitions should move to the interface headers. //===----------------------------------------------------------------------===// #ifndef ASAN_DESCRIPTIONS_H #define ASAN_DESCRIPTIONS_H #include "asan_allocator.h" #include "asan_thread.h" #include "sanitizer_common/sanitizer_common.h" #include "sanitizer_common/sanitizer_report_decorator.h" namespace __asan { void DescribeThread(AsanThreadContext *context); static inline void DescribeThread(AsanThread *t) { if (t) DescribeThread(t->context()); } class AsanThreadIdAndName { public: explicit AsanThreadIdAndName(AsanThreadContext *t); explicit AsanThreadIdAndName(u32 tid); // Contains "T%tid (%name)" or "T%tid" if the name is empty. const char *c_str() const { return &name[0]; } private: void Init(u32 tid, const char *tname); char name[128]; }; class Decorator : public __sanitizer::SanitizerCommonDecorator { public: Decorator() : SanitizerCommonDecorator() {} const char *Access() { return Blue(); } const char *Location() { return Green(); } const char *Allocation() { return Magenta(); } const char *ShadowByte(u8 byte) { switch (byte) { case kAsanHeapLeftRedzoneMagic: case kAsanArrayCookieMagic: return Red(); case kAsanHeapFreeMagic: return Magenta(); case kAsanStackLeftRedzoneMagic: case kAsanStackMidRedzoneMagic: case kAsanStackRightRedzoneMagic: return Red(); case kAsanStackAfterReturnMagic: return Magenta(); case kAsanInitializationOrderMagic: return Cyan(); case kAsanUserPoisonedMemoryMagic: case kAsanContiguousContainerOOBMagic: case kAsanAllocaLeftMagic: case kAsanAllocaRightMagic: return Blue(); case kAsanStackUseAfterScopeMagic: return Magenta(); case kAsanGlobalRedzoneMagic: return Red(); case kAsanInternalHeapMagic: return Yellow(); case kAsanIntraObjectRedzone: return Yellow(); default: return Default(); } } }; enum ShadowKind : u8 { kShadowKindLow, kShadowKindGap, kShadowKindHigh, }; static const char *const ShadowNames[] = {"low shadow", "shadow gap", "high shadow"}; struct ShadowAddressDescription { uptr addr; ShadowKind kind; u8 shadow_byte; void Print() const; }; bool GetShadowAddressInformation(uptr addr, ShadowAddressDescription *descr); bool DescribeAddressIfShadow(uptr addr); enum AccessType { kAccessTypeLeft, kAccessTypeRight, kAccessTypeInside, kAccessTypeUnknown, // This means we have an AddressSanitizer bug! }; struct ChunkAccess { uptr bad_addr; sptr offset; uptr chunk_begin; uptr chunk_size; u32 user_requested_alignment : 12; u32 access_type : 2; u32 alloc_type : 2; }; struct HeapAddressDescription { uptr addr; uptr alloc_tid; uptr free_tid; u32 alloc_stack_id; u32 free_stack_id; ChunkAccess chunk_access; void Print() const; }; bool GetHeapAddressInformation(uptr addr, uptr access_size, HeapAddressDescription *descr); bool DescribeAddressIfHeap(uptr addr, uptr access_size = 1); struct StackAddressDescription { uptr addr; uptr tid; uptr offset; uptr frame_pc; uptr access_size; const char *frame_descr; void Print() const; }; bool GetStackAddressInformation(uptr addr, uptr access_size, StackAddressDescription *descr); struct GlobalAddressDescription { uptr addr; // Assume address is close to at most four globals. static const int kMaxGlobals = 4; __asan_global globals[kMaxGlobals]; u32 reg_sites[kMaxGlobals]; uptr access_size; u8 size; void Print(const char *bug_type = "") const; // Returns true when this descriptions points inside the same global variable // as other. Descriptions can have different address within the variable bool PointsInsideTheSameVariable(const GlobalAddressDescription &other) const; }; bool GetGlobalAddressInformation(uptr addr, uptr access_size, GlobalAddressDescription *descr); bool DescribeAddressIfGlobal(uptr addr, uptr access_size, const char *bug_type); // General function to describe an address. Will try to describe the address as // a shadow, global (variable), stack, or heap address. // bug_type is optional and is used for checking if we're reporting an // initialization-order-fiasco // The proper access_size should be passed for stack, global, and heap // addresses. Defaults to 1. // Each of the *AddressDescription functions has its own Print() member, which // may take access_size and bug_type parameters if needed. void PrintAddressDescription(uptr addr, uptr access_size = 1, const char *bug_type = ""); enum AddressKind { kAddressKindWild, kAddressKindShadow, kAddressKindHeap, kAddressKindStack, kAddressKindGlobal, }; class AddressDescription { struct AddressDescriptionData { AddressKind kind; union { ShadowAddressDescription shadow; HeapAddressDescription heap; StackAddressDescription stack; GlobalAddressDescription global; uptr addr; }; }; AddressDescriptionData data; public: AddressDescription() = default; // shouldLockThreadRegistry allows us to skip locking if we're sure we already // have done it. explicit AddressDescription(uptr addr, bool shouldLockThreadRegistry = true) : AddressDescription(addr, 1, shouldLockThreadRegistry) {} AddressDescription(uptr addr, uptr access_size, bool shouldLockThreadRegistry = true); uptr Address() const { switch (data.kind) { case kAddressKindWild: return data.addr; case kAddressKindShadow: return data.shadow.addr; case kAddressKindHeap: return data.heap.addr; case kAddressKindStack: return data.stack.addr; case kAddressKindGlobal: return data.global.addr; } UNREACHABLE("AddressInformation kind is invalid"); } void Print(const char *bug_descr = nullptr) const { switch (data.kind) { case kAddressKindWild: Printf("Address %p is a wild pointer.\n", data.addr); return; case kAddressKindShadow: return data.shadow.Print(); case kAddressKindHeap: return data.heap.Print(); case kAddressKindStack: return data.stack.Print(); case kAddressKindGlobal: // initialization-order-fiasco has a special Print() return data.global.Print(bug_descr); } UNREACHABLE("AddressInformation kind is invalid"); } void StoreTo(AddressDescriptionData *dst) const { *dst = data; } const ShadowAddressDescription *AsShadow() const { return data.kind == kAddressKindShadow ? &data.shadow : nullptr; } const HeapAddressDescription *AsHeap() const { return data.kind == kAddressKindHeap ? &data.heap : nullptr; } const StackAddressDescription *AsStack() const { return data.kind == kAddressKindStack ? &data.stack : nullptr; } const GlobalAddressDescription *AsGlobal() const { return data.kind == kAddressKindGlobal ? &data.global : nullptr; } }; } // namespace __asan #endif // ASAN_DESCRIPTIONS_H
Upload File
Create Folder