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_shadow_setup.cpp
//===-- asan_shadow_setup.cpp ---------------------------------------------===// // // 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. // // Set up the shadow memory. //===----------------------------------------------------------------------===// #include "sanitizer_common/sanitizer_platform.h" // asan_fuchsia.cpp and asan_rtems.cpp have their own // InitializeShadowMemory implementation. #if !SANITIZER_FUCHSIA && !SANITIZER_RTEMS #include "asan_internal.h" #include "asan_mapping.h" namespace __asan { // ---------------------- mmap -------------------- {{{1 // Reserve memory range [beg, end]. // We need to use inclusive range because end+1 may not be representable. void ReserveShadowMemoryRange(uptr beg, uptr end, const char *name) { CHECK_EQ((beg % GetMmapGranularity()), 0); CHECK_EQ(((end + 1) % GetMmapGranularity()), 0); uptr size = end - beg + 1; DecreaseTotalMmap(size); // Don't count the shadow against mmap_limit_mb. if (!MmapFixedSuperNoReserve(beg, size, name)) { Report( "ReserveShadowMemoryRange failed while trying to map 0x%zx bytes. " "Perhaps you're using ulimit -v\n", size); Abort(); } if (common_flags()->use_madv_dontdump) DontDumpShadowMemory(beg, size); } static void ProtectGap(uptr addr, uptr size) { if (!flags()->protect_shadow_gap) { // The shadow gap is unprotected, so there is a chance that someone // is actually using this memory. Which means it needs a shadow... uptr GapShadowBeg = RoundDownTo(MEM_TO_SHADOW(addr), GetPageSizeCached()); uptr GapShadowEnd = RoundUpTo(MEM_TO_SHADOW(addr + size), GetPageSizeCached()) - 1; if (Verbosity()) Printf( "protect_shadow_gap=0:" " not protecting shadow gap, allocating gap's shadow\n" "|| `[%p, %p]` || ShadowGap's shadow ||\n", GapShadowBeg, GapShadowEnd); ReserveShadowMemoryRange(GapShadowBeg, GapShadowEnd, "unprotected gap shadow"); return; } void *res = MmapFixedNoAccess(addr, size, "shadow gap"); if (addr == (uptr)res) return; // A few pages at the start of the address space can not be protected. // But we really want to protect as much as possible, to prevent this memory // being returned as a result of a non-FIXED mmap(). if (addr == kZeroBaseShadowStart) { uptr step = GetMmapGranularity(); while (size > step && addr < kZeroBaseMaxShadowStart) { addr += step; size -= step; void *res = MmapFixedNoAccess(addr, size, "shadow gap"); if (addr == (uptr)res) return; } } Report( "ERROR: Failed to protect the shadow gap. " "ASan cannot proceed correctly. ABORTING.\n"); DumpProcessMap(); Die(); } static void MaybeReportLinuxPIEBug() { #if SANITIZER_LINUX && (defined(__x86_64__) || defined(__aarch64__)) Report("This might be related to ELF_ET_DYN_BASE change in Linux 4.12.\n"); Report( "See https://github.com/google/sanitizers/issues/856 for possible " "workarounds.\n"); #endif } void InitializeShadowMemory() { // Set the shadow memory address to uninitialized. __asan_shadow_memory_dynamic_address = kDefaultShadowSentinel; uptr shadow_start = kLowShadowBeg; // Detect if a dynamic shadow address must used and find a available location // when necessary. When dynamic address is used, the macro |kLowShadowBeg| // expands to |__asan_shadow_memory_dynamic_address| which is // |kDefaultShadowSentinel|. bool full_shadow_is_available = false; if (shadow_start == kDefaultShadowSentinel) { __asan_shadow_memory_dynamic_address = 0; CHECK_EQ(0, kLowShadowBeg); shadow_start = FindDynamicShadowStart(); if (SANITIZER_LINUX) full_shadow_is_available = true; } // Update the shadow memory address (potentially) used by instrumentation. __asan_shadow_memory_dynamic_address = shadow_start; if (kLowShadowBeg) shadow_start -= GetMmapGranularity(); if (!full_shadow_is_available) full_shadow_is_available = MemoryRangeIsAvailable(shadow_start, kHighShadowEnd); #if SANITIZER_LINUX && defined(__x86_64__) && defined(_LP64) && \ !ASAN_FIXED_MAPPING if (!full_shadow_is_available) { kMidMemBeg = kLowMemEnd < 0x3000000000ULL ? 0x3000000000ULL : 0; kMidMemEnd = kLowMemEnd < 0x3000000000ULL ? 0x4fffffffffULL : 0; } #endif if (Verbosity()) PrintAddressSpaceLayout(); if (full_shadow_is_available) { // mmap the low shadow plus at least one page at the left. if (kLowShadowBeg) ReserveShadowMemoryRange(shadow_start, kLowShadowEnd, "low shadow"); // mmap the high shadow. ReserveShadowMemoryRange(kHighShadowBeg, kHighShadowEnd, "high shadow"); // protect the gap. ProtectGap(kShadowGapBeg, kShadowGapEnd - kShadowGapBeg + 1); CHECK_EQ(kShadowGapEnd, kHighShadowBeg - 1); } else if (kMidMemBeg && MemoryRangeIsAvailable(shadow_start, kMidMemBeg - 1) && MemoryRangeIsAvailable(kMidMemEnd + 1, kHighShadowEnd)) { CHECK(kLowShadowBeg != kLowShadowEnd); // mmap the low shadow plus at least one page at the left. ReserveShadowMemoryRange(shadow_start, kLowShadowEnd, "low shadow"); // mmap the mid shadow. ReserveShadowMemoryRange(kMidShadowBeg, kMidShadowEnd, "mid shadow"); // mmap the high shadow. ReserveShadowMemoryRange(kHighShadowBeg, kHighShadowEnd, "high shadow"); // protect the gaps. ProtectGap(kShadowGapBeg, kShadowGapEnd - kShadowGapBeg + 1); ProtectGap(kShadowGap2Beg, kShadowGap2End - kShadowGap2Beg + 1); ProtectGap(kShadowGap3Beg, kShadowGap3End - kShadowGap3Beg + 1); } else { Report( "Shadow memory range interleaves with an existing memory mapping. " "ASan cannot proceed correctly. ABORTING.\n"); Report("ASan shadow was supposed to be located in the [%p-%p] range.\n", shadow_start, kHighShadowEnd); MaybeReportLinuxPIEBug(); DumpProcessMap(); Die(); } } } // namespace __asan #endif // !SANITIZER_FUCHSIA && !SANITIZER_RTEMS
Upload File
Create Folder