1e5f5895bda30f374b0b51412fd4d837fa59aed66Alexey Samsonov//===-- asan_rtl.cc -------------------------------------------------------===// 21e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// 31e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// The LLVM Compiler Infrastructure 41e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// 51e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// This file is distributed under the University of Illinois Open Source 61e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// License. See LICENSE.TXT for details. 71e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// 81e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany//===----------------------------------------------------------------------===// 91e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// 101e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// This file is a part of AddressSanitizer, an address sanity checker. 111e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// 121e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// Main file of the ASan run-time library. 131e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany//===----------------------------------------------------------------------===// 142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include "asan_activation.h" 151e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#include "asan_allocator.h" 161e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#include "asan_interceptors.h" 17230e52f4e91b53f05ce19dbbf11047f4a0113483Kostya Serebryany#include "asan_interface_internal.h" 181e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#include "asan_internal.h" 191e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#include "asan_mapping.h" 207e8434940a1fe7dce531d4c458ccd714da48f609Alexey Samsonov#include "asan_poisoning.h" 21e218beb2d14b663bd277158f386a86d0e62fef74Alexey Samsonov#include "asan_report.h" 221e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#include "asan_stack.h" 231e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#include "asan_stats.h" 241e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#include "asan_thread.h" 25fce5bd4cc29fddb5e8f0cb9c12df7c10187a991dDmitry Vyukov#include "sanitizer_common/sanitizer_atomic.h" 26cb8c4dce691097718d5af41b36899b72ef4b1d84Alexey Samsonov#include "sanitizer_common/sanitizer_flags.h" 279552db72ce37a9f090be4d9fecfbe75458c6d7bbAlexey Samsonov#include "sanitizer_common/sanitizer_libc.h" 289c6e5303fa025a73a09cee0766ae403909b1bb8bAlexey Samsonov#include "sanitizer_common/sanitizer_symbolizer.h" 2971f0411c8289b57bc1a2cb3ccc02ae7fae25fd33Sergey Matveev#include "lsan/lsan_common.h" 301e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 31230e52f4e91b53f05ce19dbbf11047f4a0113483Kostya Serebryanyint __asan_option_detect_stack_use_after_return; // Global interface symbol. 322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesuptr *__asan_test_only_reported_buggy_pointer; // Used only for testing asan. 33230e52f4e91b53f05ce19dbbf11047f4a0113483Kostya Serebryany 34591616d323d73b7ea7cd8fea4eec46cedccda27eAlexey Samsonovnamespace __asan { 3547657ce6cbac2fa93d0fd765c5d2872443b50e87Alexey Samsonov 36e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryanyuptr AsanMappingProfile[kAsanMappingProfileSize]; 37e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany 38591616d323d73b7ea7cd8fea4eec46cedccda27eAlexey Samsonovstatic void AsanDie() { 39fce5bd4cc29fddb5e8f0cb9c12df7c10187a991dDmitry Vyukov static atomic_uint32_t num_calls; 40fce5bd4cc29fddb5e8f0cb9c12df7c10187a991dDmitry Vyukov if (atomic_fetch_add(&num_calls, 1, memory_order_relaxed) != 0) { 4147657ce6cbac2fa93d0fd765c5d2872443b50e87Alexey Samsonov // Don't die twice - run a busy loop. 4247657ce6cbac2fa93d0fd765c5d2872443b50e87Alexey Samsonov while (1) { } 4347657ce6cbac2fa93d0fd765c5d2872443b50e87Alexey Samsonov } 44cb8c4dce691097718d5af41b36899b72ef4b1d84Alexey Samsonov if (flags()->sleep_before_dying) { 454e21c6bc78bdc36736cd61639a160ea5f725b333Alexey Samsonov Report("Sleeping for %d second(s)\n", flags()->sleep_before_dying); 46cb8c4dce691097718d5af41b36899b72ef4b1d84Alexey Samsonov SleepForSeconds(flags()->sleep_before_dying); 4747657ce6cbac2fa93d0fd765c5d2872443b50e87Alexey Samsonov } 48e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany if (flags()->unmap_shadow_on_exit) { 49e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany if (kMidMemBeg) { 50e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany UnmapOrDie((void*)kLowShadowBeg, kMidMemBeg - kLowShadowBeg); 51e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany UnmapOrDie((void*)kMidMemEnd, kHighShadowEnd - kMidMemEnd); 52e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany } else { 53e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany UnmapOrDie((void*)kLowShadowBeg, kHighShadowEnd - kLowShadowBeg); 54e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany } 55e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany } 562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (common_flags()->coverage) 572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __sanitizer_cov_dump(); 5847657ce6cbac2fa93d0fd765c5d2872443b50e87Alexey Samsonov if (death_callback) 5947657ce6cbac2fa93d0fd765c5d2872443b50e87Alexey Samsonov death_callback(); 60cb8c4dce691097718d5af41b36899b72ef4b1d84Alexey Samsonov if (flags()->abort_on_error) 6147657ce6cbac2fa93d0fd765c5d2872443b50e87Alexey Samsonov Abort(); 62f882247088952deed954a19d745c2dd8871e2035Alexey Samsonov internal__exit(flags()->exitcode); 6347657ce6cbac2fa93d0fd765c5d2872443b50e87Alexey Samsonov} 6447657ce6cbac2fa93d0fd765c5d2872443b50e87Alexey Samsonov 65591616d323d73b7ea7cd8fea4eec46cedccda27eAlexey Samsonovstatic void AsanCheckFailed(const char *file, int line, const char *cond, 66591616d323d73b7ea7cd8fea4eec46cedccda27eAlexey Samsonov u64 v1, u64 v2) { 672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines Report("AddressSanitizer CHECK failed: %s:%d \"%s\" (0x%zx, 0x%zx)\n", file, 682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines line, cond, (uptr)v1, (uptr)v2); 698e23d275ec871c16b71f3a98cc475f0db8cb3863Alexander Potapenko // FIXME: check for infinite recursion without a thread-local counter here. 7015a77612e0a89c1df444a2034e531c8968d0cedfAlexey Samsonov PRINT_CURRENT_STACK(); 71570c2a0e0a00a2a80ad3403139dddad2bfe75122Alexey Samsonov Die(); 7215a77612e0a89c1df444a2034e531c8968d0cedfAlexey Samsonov} 7315a77612e0a89c1df444a2034e531c8968d0cedfAlexey Samsonov 741e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// -------------------------- Flags ------------------------- {{{1 753f5528b4112a6e63d4535c1804bee4ba310879e7Sergey Matveevstatic const int kDefaultMallocContextSize = 30; 7662f10e7e8b604275ca1c7cc924f32854d04829fbAlexander Potapenko 7716cc10d9f4aeaec7e403102958dac475b08642ecKostya SerebryanyFlags asan_flags_dont_use_directly; // use via flags(). 78cb8c4dce691097718d5af41b36899b72ef4b1d84Alexey Samsonov 796a08d29b2020004b801ca69d8aea5872a7e67d72Alexey Samsonovstatic const char *MaybeCallAsanDefaultOptions() { 806a08d29b2020004b801ca69d8aea5872a7e67d72Alexey Samsonov return (&__asan_default_options) ? __asan_default_options() : ""; 816a08d29b2020004b801ca69d8aea5872a7e67d72Alexey Samsonov} 826a08d29b2020004b801ca69d8aea5872a7e67d72Alexey Samsonov 832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesstatic const char *MaybeUseAsanDefaultOptionsCompileDefinition() { 8436ea94dc39f0ed98663986f6c0409dfc0a5edeb5Alexey Samsonov#ifdef ASAN_DEFAULT_OPTIONS 8536ea94dc39f0ed98663986f6c0409dfc0a5edeb5Alexey Samsonov// Stringize the macro value. 8636ea94dc39f0ed98663986f6c0409dfc0a5edeb5Alexey Samsonov# define ASAN_STRINGIZE(x) #x 8736ea94dc39f0ed98663986f6c0409dfc0a5edeb5Alexey Samsonov# define ASAN_STRINGIZE_OPTIONS(options) ASAN_STRINGIZE(options) 8836ea94dc39f0ed98663986f6c0409dfc0a5edeb5Alexey Samsonov return ASAN_STRINGIZE_OPTIONS(ASAN_DEFAULT_OPTIONS); 8936ea94dc39f0ed98663986f6c0409dfc0a5edeb5Alexey Samsonov#else 9036ea94dc39f0ed98663986f6c0409dfc0a5edeb5Alexey Samsonov return ""; 9136ea94dc39f0ed98663986f6c0409dfc0a5edeb5Alexey Samsonov#endif 9236ea94dc39f0ed98663986f6c0409dfc0a5edeb5Alexey Samsonov} 9336ea94dc39f0ed98663986f6c0409dfc0a5edeb5Alexey Samsonov 94cb8c4dce691097718d5af41b36899b72ef4b1d84Alexey Samsonovstatic void ParseFlagsFromString(Flags *f, const char *str) { 952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CommonFlags *cf = common_flags(); 962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseCommonFlagsFromString(cf, str); 972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CHECK((uptr)cf->malloc_context_size <= kStackTraceMax); 982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // Please write meaningful flag descriptions when adding new flags. 992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->quarantine_size, "quarantine_size", 1002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "Size (in bytes) of quarantine used to detect use-after-free " 1012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "errors. Lower value may reduce memory usage but increase the " 1022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "chance of false negatives."); 1032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->redzone, "redzone", 1042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "Minimal size (in bytes) of redzones around heap objects. " 1052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "Requirement: redzone >= 16, is a power of two."); 1062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->max_redzone, "max_redzone", 1072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "Maximal size (in bytes) of redzones around heap objects."); 108a27bdf70ca24202dce21cf7c1a387aeaa400d889Kostya Serebryany CHECK_GE(f->redzone, 16); 1092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CHECK_GE(f->max_redzone, f->redzone); 1102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CHECK_LE(f->max_redzone, 2048); 111cb8c4dce691097718d5af41b36899b72ef4b1d84Alexey Samsonov CHECK(IsPowerOfTwo(f->redzone)); 1122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CHECK(IsPowerOfTwo(f->max_redzone)); 1132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->debug, "debug", 1152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "If set, prints some debugging information and does additional checks."); 1162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->report_globals, "report_globals", 1172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "Controls the way to handle globals (0 - don't detect buffer overflow on " 1182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "globals, 1 - detect buffer overflow, 2 - print data about registered " 1192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "globals)."); 1202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->check_initialization_order, 1222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "check_initialization_order", 1232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "If set, attempts to catch initialization order issues."); 1242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->replace_str, "replace_str", 1262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "If set, uses custom wrappers and replacements for libc string functions " 1272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "to find more errors."); 1282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->replace_intrin, "replace_intrin", 1302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "If set, uses custom wrappers for memset/memcpy/memmove intinsics."); 1312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->mac_ignore_invalid_free, "mac_ignore_invalid_free", 1322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "Ignore invalid free() calls to work around some bugs. Used on OS X " 1332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "only."); 134230e52f4e91b53f05ce19dbbf11047f4a0113483Kostya Serebryany ParseFlag(str, &f->detect_stack_use_after_return, 1352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "detect_stack_use_after_return", 1362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "Enables stack-use-after-return checking at run-time."); 1372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->min_uar_stack_size_log, "min_uar_stack_size_log", 1382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "Minimum fake stack size log."); 1392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->max_uar_stack_size_log, "max_uar_stack_size_log", 1402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "Maximum fake stack size log."); 1412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->uar_noreserve, "uar_noreserve", 1422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "Use mmap with 'norserve' flag to allocate fake stack."); 1432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->max_malloc_fill_size, "max_malloc_fill_size", 1442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "ASan allocator flag. max_malloc_fill_size is the maximal amount of " 1452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "bytes that will be filled with malloc_fill_byte on malloc."); 1462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->malloc_fill_byte, "malloc_fill_byte", 1472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "Value used to fill the newly allocated memory."); 1482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->exitcode, "exitcode", 1492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "Override the program exit status if the tool found an error."); 1502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->allow_user_poisoning, "allow_user_poisoning", 1512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "If set, user may manually mark memory regions as poisoned or " 1522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "unpoisoned."); 1532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->sleep_before_dying, "sleep_before_dying", 1542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "Number of seconds to sleep between printing an error report and " 1552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "terminating the program. Useful for debugging purposes (e.g. when one " 1562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "needs to attach gdb)."); 1572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->check_malloc_usable_size, "check_malloc_usable_size", 1592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "Allows the users to work around the bug in Nvidia drivers prior to " 1602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "295.*."); 1612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->unmap_shadow_on_exit, "unmap_shadow_on_exit", 1632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "If set, explicitly unmaps the (huge) shadow at exit."); 1642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->abort_on_error, "abort_on_error", 1652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "If set, the tool calls abort() instead of _exit() after printing the " 1662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "error report."); 1672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->print_stats, "print_stats", 1682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "Print various statistics after printing an error message or if " 1692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "atexit=1."); 1702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->print_legend, "print_legend", 1712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "Print the legend for the shadow bytes."); 1722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->atexit, "atexit", 1732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "If set, prints ASan exit stats even after program terminates " 1742d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "successfully."); 1752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->disable_core, "disable_core", 1772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "Disable core dumping. By default, disable_core=1 on 64-bit to avoid " 1782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "dumping a 16T+ core file. " 1792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "Ignored on OSes that don't dump core by default."); 1802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->allow_reexec, "allow_reexec", 1822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "Allow the tool to re-exec the program. This may interfere badly with " 1832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "the debugger."); 1842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->print_full_thread_history, 1862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "print_full_thread_history", 1872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "If set, prints thread creation stacks for the threads involved in the " 1882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "report and their ancestors up to the main thread."); 1892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->poison_heap, "poison_heap", 1912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "Poison (or not) the heap memory on [de]allocation. Zero value is useful " 1922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "for benchmarking the allocator or instrumentator."); 1932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->poison_partial, "poison_partial", 1952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "If true, poison partially addressable 8-byte aligned words " 1962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "(default=true). This flag affects heap and global buffers, but not " 1972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "stack buffers."); 1982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->alloc_dealloc_mismatch, "alloc_dealloc_mismatch", 2002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "Report errors on malloc/delete, new/free, new/delete[], etc."); 2012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->strict_memcmp, "strict_memcmp", 2022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "If true, assume that memcmp(p1, p2, n) always reads n bytes before " 2032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "comparing p1 and p2."); 2042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 2052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->strict_init_order, "strict_init_order", 2062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "If true, assume that dynamic initializers can never access globals from " 2072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "other modules, even if the latter are already initialized."); 2082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 2092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->start_deactivated, "start_deactivated", 2102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "If true, ASan tweaks a bunch of other flags (quarantine, redzone, heap " 2112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "poisoning) to reduce memory consumption as much as possible, and " 2122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "restores them to original values when the first instrumented module is " 2132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "loaded into the process. This is mainly intended to be used on " 2142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "Android. "); 2152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 2162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->detect_invalid_pointer_pairs, 2172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "detect_invalid_pointer_pairs", 2182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "If non-zero, try to detect operations like <, <=, >, >= and - on " 2192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "invalid pointer pairs (e.g. when pointers belong to different objects). " 2202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "The bigger the value the harder we try."); 2212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 2222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->detect_container_overflow, 2232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "detect_container_overflow", 2242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "If true, honor the container overflow annotations. " 2252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "See https://code.google.com/p/address-sanitizer/wiki/ContainerOverflow"); 2262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 2272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlag(str, &f->detect_odr_violation, "detect_odr_violation", 2282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "If >=2, detect violation of One-Definition-Rule (ODR); " 2292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "If ==1, detect ODR-violation only if the two variables " 2302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "have different sizes"); 231cb8c4dce691097718d5af41b36899b72ef4b1d84Alexey Samsonov} 232cb8c4dce691097718d5af41b36899b72ef4b1d84Alexey Samsonov 233cb8c4dce691097718d5af41b36899b72ef4b1d84Alexey Samsonovvoid InitializeFlags(Flags *f, const char *env) { 234ed20ebe35c64b8c7043447f6a48b0e5adc89adedSergey Matveev CommonFlags *cf = common_flags(); 2352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines SetCommonFlagsDefaults(cf); 2362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines cf->detect_leaks = CAN_SANITIZE_LEAKS; 237ed20ebe35c64b8c7043447f6a48b0e5adc89adedSergey Matveev cf->external_symbolizer_path = GetEnv("ASAN_SYMBOLIZER_PATH"); 238ed20ebe35c64b8c7043447f6a48b0e5adc89adedSergey Matveev cf->malloc_context_size = kDefaultMallocContextSize; 2392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines cf->intercept_tls_get_addr = true; 2402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines cf->coverage = false; 241cb8c4dce691097718d5af41b36899b72ef4b1d84Alexey Samsonov 242ed20ebe35c64b8c7043447f6a48b0e5adc89adedSergey Matveev internal_memset(f, 0, sizeof(*f)); 2437315c26122cbdfee82f4dbadaedd5c1b85755503Evgeniy Stepanov f->quarantine_size = (ASAN_LOW_MEMORY) ? 1UL << 26 : 1UL << 28; 244b1971ca4a3057916ca90a733c672a08127d5fe67Kostya Serebryany f->redzone = 16; 2452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines f->max_redzone = 2048; 2467ed1d2b699767dd1875994cb625d51a95b44221aAlexey Samsonov f->debug = false; 247cb8c4dce691097718d5af41b36899b72ef4b1d84Alexey Samsonov f->report_globals = 1; 248e9e2b7f964413dccf4c724eb9ca39d2686cc29d4Alexey Samsonov f->check_initialization_order = false; 249cb8c4dce691097718d5af41b36899b72ef4b1d84Alexey Samsonov f->replace_str = true; 250cb8c4dce691097718d5af41b36899b72ef4b1d84Alexey Samsonov f->replace_intrin = true; 2517ed1d2b699767dd1875994cb625d51a95b44221aAlexey Samsonov f->mac_ignore_invalid_free = false; 252b0796022fb8f47939696b2e57c17e1603eda1f9dKostya Serebryany f->detect_stack_use_after_return = false; // Also needs the compiler flag. 2532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines f->min_uar_stack_size_log = 16; // We can't do smaller anyway. 2542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines f->max_uar_stack_size_log = 20; // 1Mb per size class, i.e. ~11Mb per thread. 2552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines f->uar_noreserve = false; 2562a3619ecbb56e828090b4c40ece28550f68c94deKostya Serebryany f->max_malloc_fill_size = 0x1000; // By default, fill only the first 4K. 2572a3619ecbb56e828090b4c40ece28550f68c94deKostya Serebryany f->malloc_fill_byte = 0xbe; 258cb8c4dce691097718d5af41b36899b72ef4b1d84Alexey Samsonov f->exitcode = ASAN_DEFAULT_FAILURE_EXITCODE; 259cb8c4dce691097718d5af41b36899b72ef4b1d84Alexey Samsonov f->allow_user_poisoning = true; 260cb8c4dce691097718d5af41b36899b72ef4b1d84Alexey Samsonov f->sleep_before_dying = 0; 261cb8c4dce691097718d5af41b36899b72ef4b1d84Alexey Samsonov f->check_malloc_usable_size = true; 262cb8c4dce691097718d5af41b36899b72ef4b1d84Alexey Samsonov f->unmap_shadow_on_exit = false; 263cb8c4dce691097718d5af41b36899b72ef4b1d84Alexey Samsonov f->abort_on_error = false; 26495f630ae40cef78fb03b18110eff43bcf8d1c040Kostya Serebryany f->print_stats = false; 26595f630ae40cef78fb03b18110eff43bcf8d1c040Kostya Serebryany f->print_legend = true; 266cb8c4dce691097718d5af41b36899b72ef4b1d84Alexey Samsonov f->atexit = false; 2675af39e50366f1aacbebc284f572f08ad1ad07357Kostya Serebryany f->disable_core = (SANITIZER_WORDSIZE == 64); 268eb8c46e419f4c6f01d1b1a0d1b96cc51a61ecbc3Alexander Potapenko f->allow_reexec = true; 26971b42c9740e6f73da607aaa539affb5c4807231cAlexey Samsonov f->print_full_thread_history = true; 27073bad81febb2a872627c03e579beea1da4b49294Kostya Serebryany f->poison_heap = true; 271cca8e781e5353cba810a0ec3a814ddde2c4934e7Kostya Serebryany f->poison_partial = true; 272a0e78c9dbd9cc27aebf765cc69a1158df5a05bb9Timur Iskhodzhanov // Turn off alloc/dealloc mismatch checker on Mac and Windows for now. 2732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // https://code.google.com/p/address-sanitizer/issues/detail?id=131 2742d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // https://code.google.com/p/address-sanitizer/issues/detail?id=309 275a0e78c9dbd9cc27aebf765cc69a1158df5a05bb9Timur Iskhodzhanov // TODO(glider,timurrrr): Fix known issues and enable this back. 276a0e78c9dbd9cc27aebf765cc69a1158df5a05bb9Timur Iskhodzhanov f->alloc_dealloc_mismatch = (SANITIZER_MAC == 0) && (SANITIZER_WINDOWS == 0); 2778bd5e74fa9d37a182088114918380e255e22e493Alexander Potapenko f->strict_memcmp = true; 278dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov f->strict_init_order = false; 2792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines f->start_deactivated = false; 2802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines f->detect_invalid_pointer_pairs = 0; 2812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines f->detect_container_overflow = true; 2825d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines f->detect_odr_violation = 2; 283cb8c4dce691097718d5af41b36899b72ef4b1d84Alexey Samsonov 28436ea94dc39f0ed98663986f6c0409dfc0a5edeb5Alexey Samsonov // Override from compile definition. 2852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlagsFromString(f, MaybeUseAsanDefaultOptionsCompileDefinition()); 28636ea94dc39f0ed98663986f6c0409dfc0a5edeb5Alexey Samsonov 287cb8c4dce691097718d5af41b36899b72ef4b1d84Alexey Samsonov // Override from user-specified string. 2886a08d29b2020004b801ca69d8aea5872a7e67d72Alexey Samsonov ParseFlagsFromString(f, MaybeCallAsanDefaultOptions()); 2892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines VReport(1, "Using the defaults from __asan_default_options: %s\n", 2902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines MaybeCallAsanDefaultOptions()); 291cb8c4dce691097718d5af41b36899b72ef4b1d84Alexey Samsonov 292cb8c4dce691097718d5af41b36899b72ef4b1d84Alexey Samsonov // Override from command line. 293cb8c4dce691097718d5af41b36899b72ef4b1d84Alexey Samsonov ParseFlagsFromString(f, env); 2942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (common_flags()->help) { 2952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines PrintFlagDescriptions(); 2962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 29771f0411c8289b57bc1a2cb3ccc02ae7fae25fd33Sergey Matveev 2982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (!CAN_SANITIZE_LEAKS && cf->detect_leaks) { 29971f0411c8289b57bc1a2cb3ccc02ae7fae25fd33Sergey Matveev Report("%s: detect_leaks is not supported on this platform.\n", 30071f0411c8289b57bc1a2cb3ccc02ae7fae25fd33Sergey Matveev SanitizerToolName); 30162519eb72ec1005d794685c1ec09df7c37631b27Sergey Matveev cf->detect_leaks = false; 30271f0411c8289b57bc1a2cb3ccc02ae7fae25fd33Sergey Matveev } 303e9e2b7f964413dccf4c724eb9ca39d2686cc29d4Alexey Samsonov 304e9e2b7f964413dccf4c724eb9ca39d2686cc29d4Alexey Samsonov // Make "strict_init_order" imply "check_initialization_order". 305e9e2b7f964413dccf4c724eb9ca39d2686cc29d4Alexey Samsonov // TODO(samsonov): Use a single runtime flag for an init-order checker. 306e9e2b7f964413dccf4c724eb9ca39d2686cc29d4Alexey Samsonov if (f->strict_init_order) { 307e9e2b7f964413dccf4c724eb9ca39d2686cc29d4Alexey Samsonov f->check_initialization_order = true; 308e9e2b7f964413dccf4c724eb9ca39d2686cc29d4Alexey Samsonov } 309cb8c4dce691097718d5af41b36899b72ef4b1d84Alexey Samsonov} 3101e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 3112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// Parse flags that may change between startup and activation. 3122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// On Android they come from a system property. 3132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// On other platforms this is no-op. 3142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid ParseExtraActivationFlags() { 3152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char buf[100]; 3162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines GetExtraActivationFlags(buf, sizeof(buf)); 3172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseFlagsFromString(flags(), buf); 3182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (buf[0] != '\0') 3192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines VReport(1, "Extra activation flags: %s\n", buf); 3202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 3212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 3221e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// -------------------------- Globals --------------------- {{{1 3231e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyint asan_inited; 3241e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanybool asan_init_is_running; 32547657ce6cbac2fa93d0fd765c5d2872443b50e87Alexey Samsonovvoid (*death_callback)(void); 326e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany 327e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany#if !ASAN_FIXED_MAPPING 328e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryanyuptr kHighMemEnd, kMidMemBeg, kMidMemEnd; 329e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany#endif 3301e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 3311e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// -------------------------- Misc ---------------- {{{1 3321e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyvoid ShowStatsAndAbort() { 3331e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany __asan_print_accumulated_stats(); 33447657ce6cbac2fa93d0fd765c5d2872443b50e87Alexey Samsonov Die(); 3351e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} 3361e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 3371e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// ---------------------- mmap -------------------- {{{1 338a874fe5b5d67152e4e737498d532eec80940bdcdKostya Serebryany// Reserve memory range [beg, end]. 3393f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryanystatic void ReserveShadowMemoryRange(uptr beg, uptr end) { 340a27bdf70ca24202dce21cf7c1a387aeaa400d889Kostya Serebryany CHECK_EQ((beg % GetPageSizeCached()), 0); 341a27bdf70ca24202dce21cf7c1a387aeaa400d889Kostya Serebryany CHECK_EQ(((end + 1) % GetPageSizeCached()), 0); 3423f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany uptr size = end - beg + 1; 3432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines DecreaseTotalMmap(size); // Don't count the shadow against mmap_limit_mb. 344f607fc1c67a613a59a1db3c80c5d1322e1978102Alexey Samsonov void *res = MmapFixedNoReserve(beg, size); 3455aabcb547a983653a754258d63e27e3790c564d3Alexander Potapenko if (res != (void*)beg) { 3465aabcb547a983653a754258d63e27e3790c564d3Alexander Potapenko Report("ReserveShadowMemoryRange failed while trying to map 0x%zx bytes. " 3475aabcb547a983653a754258d63e27e3790c564d3Alexander Potapenko "Perhaps you're using ulimit -v\n", size); 3485aabcb547a983653a754258d63e27e3790c564d3Alexander Potapenko Abort(); 3495aabcb547a983653a754258d63e27e3790c564d3Alexander Potapenko } 3501e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} 3511e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 35270e177e29c6f9ac987b65a79f6b4f3ebdabc75ccAlexey Samsonov// --------------- LowLevelAllocateCallbac ---------- {{{1 35370e177e29c6f9ac987b65a79f6b4f3ebdabc75ccAlexey Samsonovstatic void OnLowLevelAllocate(uptr ptr, uptr size) { 35470e177e29c6f9ac987b65a79f6b4f3ebdabc75ccAlexey Samsonov PoisonShadow(ptr, size, kAsanInternalHeapMagic); 355b89567ce41bef82cf92a9c741c78b632c07b2781Kostya Serebryany} 356b89567ce41bef82cf92a9c741c78b632c07b2781Kostya Serebryany 3571e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// -------------------------- Run-time entry ------------------- {{{1 3581e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// exported functions 35951e75c45a6886455a5bdb91c0951bc77dd2c47a2Kostya Serebryany#define ASAN_REPORT_ERROR(type, is_write, size) \ 3600a4c906dbc8f150657ddd4f19a7192b779f1d605Alexey Samsonovextern "C" NOINLINE INTERFACE_ATTRIBUTE \ 3613f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryanyvoid __asan_report_ ## type ## size(uptr addr); \ 3623f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryanyvoid __asan_report_ ## type ## size(uptr addr) { \ 3639f311bb0919d86ab3df2810dc0b81b70a87677e3Kostya Serebryany GET_CALLER_PC_BP_SP; \ 36451e75c45a6886455a5bdb91c0951bc77dd2c47a2Kostya Serebryany __asan_report_error(pc, bp, sp, addr, is_write, size); \ 3651e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} 3661e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 3671e172b4bdec57329bf904f063a29f99cddf2d85fKostya SerebryanyASAN_REPORT_ERROR(load, false, 1) 3681e172b4bdec57329bf904f063a29f99cddf2d85fKostya SerebryanyASAN_REPORT_ERROR(load, false, 2) 3691e172b4bdec57329bf904f063a29f99cddf2d85fKostya SerebryanyASAN_REPORT_ERROR(load, false, 4) 3701e172b4bdec57329bf904f063a29f99cddf2d85fKostya SerebryanyASAN_REPORT_ERROR(load, false, 8) 3711e172b4bdec57329bf904f063a29f99cddf2d85fKostya SerebryanyASAN_REPORT_ERROR(load, false, 16) 3721e172b4bdec57329bf904f063a29f99cddf2d85fKostya SerebryanyASAN_REPORT_ERROR(store, true, 1) 3731e172b4bdec57329bf904f063a29f99cddf2d85fKostya SerebryanyASAN_REPORT_ERROR(store, true, 2) 3741e172b4bdec57329bf904f063a29f99cddf2d85fKostya SerebryanyASAN_REPORT_ERROR(store, true, 4) 3751e172b4bdec57329bf904f063a29f99cddf2d85fKostya SerebryanyASAN_REPORT_ERROR(store, true, 8) 3761e172b4bdec57329bf904f063a29f99cddf2d85fKostya SerebryanyASAN_REPORT_ERROR(store, true, 16) 3771e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 378366984e3aa286f7b4fb45f5c9e703f2768c407edKostya Serebryany#define ASAN_REPORT_ERROR_N(type, is_write) \ 379366984e3aa286f7b4fb45f5c9e703f2768c407edKostya Serebryanyextern "C" NOINLINE INTERFACE_ATTRIBUTE \ 380366984e3aa286f7b4fb45f5c9e703f2768c407edKostya Serebryanyvoid __asan_report_ ## type ## _n(uptr addr, uptr size); \ 381366984e3aa286f7b4fb45f5c9e703f2768c407edKostya Serebryanyvoid __asan_report_ ## type ## _n(uptr addr, uptr size) { \ 382366984e3aa286f7b4fb45f5c9e703f2768c407edKostya Serebryany GET_CALLER_PC_BP_SP; \ 383366984e3aa286f7b4fb45f5c9e703f2768c407edKostya Serebryany __asan_report_error(pc, bp, sp, addr, is_write, size); \ 384366984e3aa286f7b4fb45f5c9e703f2768c407edKostya Serebryany} 385366984e3aa286f7b4fb45f5c9e703f2768c407edKostya Serebryany 386366984e3aa286f7b4fb45f5c9e703f2768c407edKostya SerebryanyASAN_REPORT_ERROR_N(load, false) 387366984e3aa286f7b4fb45f5c9e703f2768c407edKostya SerebryanyASAN_REPORT_ERROR_N(store, true) 388366984e3aa286f7b4fb45f5c9e703f2768c407edKostya Serebryany 3892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#define ASAN_MEMORY_ACCESS_CALLBACK(type, is_write, size) \ 3902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines extern "C" NOINLINE INTERFACE_ATTRIBUTE void __asan_##type##size(uptr addr); \ 3912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines void __asan_##type##size(uptr addr) { \ 3922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uptr sp = MEM_TO_SHADOW(addr); \ 3932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uptr s = size <= SHADOW_GRANULARITY ? *reinterpret_cast<u8 *>(sp) \ 3942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines : *reinterpret_cast<u16 *>(sp); \ 3952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (UNLIKELY(s)) { \ 3962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (UNLIKELY(size >= SHADOW_GRANULARITY || \ 3972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ((s8)((addr & (SHADOW_GRANULARITY - 1)) + size - 1)) >= \ 3982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines (s8)s)) { \ 3992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (__asan_test_only_reported_buggy_pointer) { \ 4002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines *__asan_test_only_reported_buggy_pointer = addr; \ 4012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } else { \ 4022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines GET_CALLER_PC_BP_SP; \ 4032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __asan_report_error(pc, bp, sp, addr, is_write, size); \ 4042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } \ 4052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } \ 4062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } \ 4072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 4082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 4092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesASAN_MEMORY_ACCESS_CALLBACK(load, false, 1) 4102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesASAN_MEMORY_ACCESS_CALLBACK(load, false, 2) 4112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesASAN_MEMORY_ACCESS_CALLBACK(load, false, 4) 4122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesASAN_MEMORY_ACCESS_CALLBACK(load, false, 8) 4132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesASAN_MEMORY_ACCESS_CALLBACK(load, false, 16) 4142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesASAN_MEMORY_ACCESS_CALLBACK(store, true, 1) 4152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesASAN_MEMORY_ACCESS_CALLBACK(store, true, 2) 4162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesASAN_MEMORY_ACCESS_CALLBACK(store, true, 4) 4172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesASAN_MEMORY_ACCESS_CALLBACK(store, true, 8) 4182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesASAN_MEMORY_ACCESS_CALLBACK(store, true, 16) 4192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 4202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesextern "C" 4212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesNOINLINE INTERFACE_ATTRIBUTE void __asan_loadN(uptr addr, uptr size) { 4222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (__asan_region_is_poisoned(addr, size)) { 4232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines GET_CALLER_PC_BP_SP; 4242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __asan_report_error(pc, bp, sp, addr, false, size); 4252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 4262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 4272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 4282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesextern "C" 4292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesNOINLINE INTERFACE_ATTRIBUTE void __asan_storeN(uptr addr, uptr size) { 4302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (__asan_region_is_poisoned(addr, size)) { 4312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines GET_CALLER_PC_BP_SP; 4322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __asan_report_error(pc, bp, sp, addr, true, size); 4332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 4342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 4352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 4361e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// Force the linker to keep the symbols for various ASan interface functions. 4371e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// We want to keep those in the executable in order to let the instrumented 4381e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// dynamic libraries access the symbol even if it is not used by the executable 4391e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// itself. This should help if the build system is removing dead code at link 4401e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// time. 4413fe913558354f76707e2c5584559521399854b79Alexander Potapenkostatic NOINLINE void force_interface_symbols() { 4421e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany volatile int fake_condition = 0; // prevent dead condition elimination. 443448fe9a2383222633194754de34e6a3c0351ac68Alexander Potapenko // __asan_report_* functions are noreturn, so we need a switch to prevent 444448fe9a2383222633194754de34e6a3c0351ac68Alexander Potapenko // the compiler from removing any of them. 445448fe9a2383222633194754de34e6a3c0351ac68Alexander Potapenko switch (fake_condition) { 446448fe9a2383222633194754de34e6a3c0351ac68Alexander Potapenko case 1: __asan_report_load1(0); break; 447448fe9a2383222633194754de34e6a3c0351ac68Alexander Potapenko case 2: __asan_report_load2(0); break; 448448fe9a2383222633194754de34e6a3c0351ac68Alexander Potapenko case 3: __asan_report_load4(0); break; 449448fe9a2383222633194754de34e6a3c0351ac68Alexander Potapenko case 4: __asan_report_load8(0); break; 450448fe9a2383222633194754de34e6a3c0351ac68Alexander Potapenko case 5: __asan_report_load16(0); break; 451448fe9a2383222633194754de34e6a3c0351ac68Alexander Potapenko case 6: __asan_report_store1(0); break; 452448fe9a2383222633194754de34e6a3c0351ac68Alexander Potapenko case 7: __asan_report_store2(0); break; 453448fe9a2383222633194754de34e6a3c0351ac68Alexander Potapenko case 8: __asan_report_store4(0); break; 454448fe9a2383222633194754de34e6a3c0351ac68Alexander Potapenko case 9: __asan_report_store8(0); break; 455448fe9a2383222633194754de34e6a3c0351ac68Alexander Potapenko case 10: __asan_report_store16(0); break; 456448fe9a2383222633194754de34e6a3c0351ac68Alexander Potapenko case 12: __asan_register_globals(0, 0); break; 457448fe9a2383222633194754de34e6a3c0351ac68Alexander Potapenko case 13: __asan_unregister_globals(0, 0); break; 458448fe9a2383222633194754de34e6a3c0351ac68Alexander Potapenko case 14: __asan_set_death_callback(0); break; 459448fe9a2383222633194754de34e6a3c0351ac68Alexander Potapenko case 15: __asan_set_error_report_callback(0); break; 460448fe9a2383222633194754de34e6a3c0351ac68Alexander Potapenko case 16: __asan_handle_no_return(); break; 4615a9938d4de74d41cb5f167f751a621dfb7545b64Alexander Potapenko case 17: __asan_address_is_poisoned(0); break; 4625a9938d4de74d41cb5f167f751a621dfb7545b64Alexander Potapenko case 18: __asan_get_allocated_size(0); break; 4635a9938d4de74d41cb5f167f751a621dfb7545b64Alexander Potapenko case 19: __asan_get_current_allocated_bytes(); break; 4645a9938d4de74d41cb5f167f751a621dfb7545b64Alexander Potapenko case 20: __asan_get_estimated_allocated_size(0); break; 4655a9938d4de74d41cb5f167f751a621dfb7545b64Alexander Potapenko case 21: __asan_get_free_bytes(); break; 4665a9938d4de74d41cb5f167f751a621dfb7545b64Alexander Potapenko case 22: __asan_get_heap_size(); break; 4675a9938d4de74d41cb5f167f751a621dfb7545b64Alexander Potapenko case 23: __asan_get_ownership(0); break; 4685a9938d4de74d41cb5f167f751a621dfb7545b64Alexander Potapenko case 24: __asan_get_unmapped_bytes(); break; 4695a9938d4de74d41cb5f167f751a621dfb7545b64Alexander Potapenko case 25: __asan_poison_memory_region(0, 0); break; 4705a9938d4de74d41cb5f167f751a621dfb7545b64Alexander Potapenko case 26: __asan_unpoison_memory_region(0, 0); break; 4715a9938d4de74d41cb5f167f751a621dfb7545b64Alexander Potapenko case 27: __asan_set_error_exit_code(0); break; 47205e16a028d26503153a8fe512a500676cad66031Alexey Samsonov case 30: __asan_before_dynamic_init(0); break; 4736a08d29b2020004b801ca69d8aea5872a7e67d72Alexey Samsonov case 31: __asan_after_dynamic_init(); break; 4746a08d29b2020004b801ca69d8aea5872a7e67d72Alexey Samsonov case 32: __asan_poison_stack_memory(0, 0); break; 4756a08d29b2020004b801ca69d8aea5872a7e67d72Alexey Samsonov case 33: __asan_unpoison_stack_memory(0, 0); break; 476eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany case 34: __asan_region_is_poisoned(0, 0); break; 47717a7c6763224300f6740b5e7fae274734afec675Kostya Serebryany case 35: __asan_describe_address(0); break; 4781e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany } 4791e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} 4801e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 4811e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanystatic void asan_atexit() { 482283c296b64bc55deec9698260b3427a9b050a925Kostya Serebryany Printf("AddressSanitizer exit stats:\n"); 4831e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany __asan_print_accumulated_stats(); 484e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany // Print AsanMappingProfile. 485e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany for (uptr i = 0; i < kAsanMappingProfileSize; i++) { 486e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany if (AsanMappingProfile[i] == 0) continue; 487e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany Printf("asan_mapping.h:%zd -- %zd\n", i, AsanMappingProfile[i]); 488e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany } 4891e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} 4901e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 491e5ab9688b623a5a0150c7eae1ec1caaf06d44758Kostya Serebryanystatic void InitializeHighMemEnd() { 492e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany#if !ASAN_FIXED_MAPPING 493bb7f2d880c843dd5ee1c5e53d2517f7ca9058e66Timur Iskhodzhanov kHighMemEnd = GetMaxVirtualAddress(); 494bb7f2d880c843dd5ee1c5e53d2517f7ca9058e66Timur Iskhodzhanov // Increase kHighMemEnd to make sure it's properly 495bb7f2d880c843dd5ee1c5e53d2517f7ca9058e66Timur Iskhodzhanov // aligned together with kHighMemBeg: 496bb7f2d880c843dd5ee1c5e53d2517f7ca9058e66Timur Iskhodzhanov kHighMemEnd |= SHADOW_GRANULARITY * GetPageSizeCached() - 1; 497e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany#endif // !ASAN_FIXED_MAPPING 498bb7f2d880c843dd5ee1c5e53d2517f7ca9058e66Timur Iskhodzhanov CHECK_EQ((kHighMemBeg % GetPageSizeCached()), 0); 499e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany} 500e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany 501e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryanystatic void ProtectGap(uptr a, uptr size) { 502e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany CHECK_EQ(a, (uptr)Mprotect(a, size)); 503e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany} 504e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany 505e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryanystatic void PrintAddressSpaceLayout() { 506e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany Printf("|| `[%p, %p]` || HighMem ||\n", 507e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany (void*)kHighMemBeg, (void*)kHighMemEnd); 508e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany Printf("|| `[%p, %p]` || HighShadow ||\n", 509e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany (void*)kHighShadowBeg, (void*)kHighShadowEnd); 510e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany if (kMidMemBeg) { 511e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany Printf("|| `[%p, %p]` || ShadowGap3 ||\n", 512e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany (void*)kShadowGap3Beg, (void*)kShadowGap3End); 513e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany Printf("|| `[%p, %p]` || MidMem ||\n", 514e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany (void*)kMidMemBeg, (void*)kMidMemEnd); 515e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany Printf("|| `[%p, %p]` || ShadowGap2 ||\n", 516e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany (void*)kShadowGap2Beg, (void*)kShadowGap2End); 517e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany Printf("|| `[%p, %p]` || MidShadow ||\n", 518e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany (void*)kMidShadowBeg, (void*)kMidShadowEnd); 519e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany } 520e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany Printf("|| `[%p, %p]` || ShadowGap ||\n", 521e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany (void*)kShadowGapBeg, (void*)kShadowGapEnd); 522e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany if (kLowShadowBeg) { 523e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany Printf("|| `[%p, %p]` || LowShadow ||\n", 524e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany (void*)kLowShadowBeg, (void*)kLowShadowEnd); 525e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany Printf("|| `[%p, %p]` || LowMem ||\n", 526e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany (void*)kLowMemBeg, (void*)kLowMemEnd); 527e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany } 528e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany Printf("MemToShadow(shadow): %p %p %p %p", 529e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany (void*)MEM_TO_SHADOW(kLowShadowBeg), 530e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany (void*)MEM_TO_SHADOW(kLowShadowEnd), 531e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany (void*)MEM_TO_SHADOW(kHighShadowBeg), 532e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany (void*)MEM_TO_SHADOW(kHighShadowEnd)); 533e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany if (kMidMemBeg) { 534e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany Printf(" %p %p", 535e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany (void*)MEM_TO_SHADOW(kMidShadowBeg), 536e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany (void*)MEM_TO_SHADOW(kMidShadowEnd)); 537e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany } 538e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany Printf("\n"); 5392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines Printf("redzone=%zu\n", (uptr)flags()->redzone); 5402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines Printf("max_redzone=%zu\n", (uptr)flags()->max_redzone); 54134e3ed1db94c5ce9784d7ffb8d66a54cf523e09cKostya Serebryany Printf("quarantine_size=%zuM\n", (uptr)flags()->quarantine_size >> 20); 542ed20ebe35c64b8c7043447f6a48b0e5adc89adedSergey Matveev Printf("malloc_context_size=%zu\n", 543ed20ebe35c64b8c7043447f6a48b0e5adc89adedSergey Matveev (uptr)common_flags()->malloc_context_size); 544e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany 545e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany Printf("SHADOW_SCALE: %zx\n", (uptr)SHADOW_SCALE); 546e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany Printf("SHADOW_GRANULARITY: %zx\n", (uptr)SHADOW_GRANULARITY); 547e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany Printf("SHADOW_OFFSET: %zx\n", (uptr)SHADOW_OFFSET); 548e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany CHECK(SHADOW_SCALE >= 3 && SHADOW_SCALE <= 7); 549e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany if (kMidMemBeg) 550e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany CHECK(kMidShadowBeg > kLowShadowEnd && 551e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany kMidMemBeg > kMidShadowEnd && 552e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany kHighShadowBeg > kMidMemEnd); 553e5ab9688b623a5a0150c7eae1ec1caaf06d44758Kostya Serebryany} 554e5ab9688b623a5a0150c7eae1ec1caaf06d44758Kostya Serebryany 5552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesstatic void AsanInitInternal() { 5562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (LIKELY(asan_inited)) return; 557859778a4e2dffa4024fa3e13b105fd62eca44b1cKostya Serebryany SanitizerToolName = "AddressSanitizer"; 55870e177e29c6f9ac987b65a79f6b4f3ebdabc75ccAlexey Samsonov CHECK(!asan_init_is_running && "ASan init calls itself!"); 559fca72fd2741372d2e947366277258bff1092e73eAlexander Potapenko asan_init_is_running = true; 5602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 5612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // Initialize flags. This must be done early, because most of the 5622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // initialization steps look at flags(). 5632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines const char *options = GetEnv("ASAN_OPTIONS"); 5642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines InitializeFlags(flags(), options); 5652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 566e5ab9688b623a5a0150c7eae1ec1caaf06d44758Kostya Serebryany InitializeHighMemEnd(); 567fca72fd2741372d2e947366277258bff1092e73eAlexander Potapenko 568fca72fd2741372d2e947366277258bff1092e73eAlexander Potapenko // Make sure we are not statically linked. 569fca72fd2741372d2e947366277258bff1092e73eAlexander Potapenko AsanDoesNotSupportStaticLinkage(); 570fca72fd2741372d2e947366277258bff1092e73eAlexander Potapenko 571591616d323d73b7ea7cd8fea4eec46cedccda27eAlexey Samsonov // Install tool-specific callbacks in sanitizer_common. 572591616d323d73b7ea7cd8fea4eec46cedccda27eAlexey Samsonov SetDieCallback(AsanDie); 573591616d323d73b7ea7cd8fea4eec46cedccda27eAlexey Samsonov SetCheckFailedCallback(AsanCheckFailed); 574283c296b64bc55deec9698260b3427a9b050a925Kostya Serebryany SetPrintfAndReportCallback(AppendToErrorMessageBuffer); 575283c296b64bc55deec9698260b3427a9b050a925Kostya Serebryany 5762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (!flags()->start_deactivated) 5772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ParseExtraActivationFlags(); 5782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 579b6246066a271e3b01732d1b4381ef745152747d2Evgeniy Stepanov __sanitizer_set_report_path(common_flags()->log_path); 580230e52f4e91b53f05ce19dbbf11047f4a0113483Kostya Serebryany __asan_option_detect_stack_use_after_return = 581230e52f4e91b53f05ce19dbbf11047f4a0113483Kostya Serebryany flags()->detect_stack_use_after_return; 5822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CHECK_LE(flags()->min_uar_stack_size_log, flags()->max_uar_stack_size_log); 583feb479345ccc947e3e7429b949caa7f89c84a85eAlexander Potapenko 5842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (options) { 5852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines VReport(1, "Parsed ASAN_OPTIONS: %s\n", options); 586feb479345ccc947e3e7429b949caa7f89c84a85eAlexander Potapenko } 587feb479345ccc947e3e7429b949caa7f89c84a85eAlexander Potapenko 5882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (flags()->start_deactivated) 5892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines AsanStartDeactivated(); 5902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 591eb8c46e419f4c6f01d1b1a0d1b96cc51a61ecbc3Alexander Potapenko // Re-exec ourselves if we need to set additional env or command line args. 592eb8c46e419f4c6f01d1b1a0d1b96cc51a61ecbc3Alexander Potapenko MaybeReexec(); 593eb8c46e419f4c6f01d1b1a0d1b96cc51a61ecbc3Alexander Potapenko 594947fbd1a073fcd38988c1ec131452e99bb0313f8Alexey Samsonov // Setup internal allocator callback. 595947fbd1a073fcd38988c1ec131452e99bb0313f8Alexey Samsonov SetLowLevelAllocateCallback(OnLowLevelAllocate); 596947fbd1a073fcd38988c1ec131452e99bb0313f8Alexey Samsonov 5971e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany InitializeAsanInterceptors(); 5981e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 5991e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany ReplaceSystemMalloc(); 6001e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 601e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany uptr shadow_start = kLowShadowBeg; 602bb7f2d880c843dd5ee1c5e53d2517f7ca9058e66Timur Iskhodzhanov if (kLowShadowBeg) 603bb7f2d880c843dd5ee1c5e53d2517f7ca9058e66Timur Iskhodzhanov shadow_start -= GetMmapGranularity(); 604e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany bool full_shadow_is_available = 605bb7f2d880c843dd5ee1c5e53d2517f7ca9058e66Timur Iskhodzhanov MemoryRangeIsAvailable(shadow_start, kHighShadowEnd); 606e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany 60783cb7877f608eb9b3d65981095216842f686c527Evgeniy Stepanov#if SANITIZER_LINUX && defined(__x86_64__) && !ASAN_FIXED_MAPPING 608e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany if (!full_shadow_is_available) { 609e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany kMidMemBeg = kLowMemEnd < 0x3000000000ULL ? 0x3000000000ULL : 0; 61013577fed9ac2ebe5e4800b8f83e3a80832907de2Kostya Serebryany kMidMemEnd = kLowMemEnd < 0x3000000000ULL ? 0x4fffffffffULL : 0; 6111e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany } 612e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany#endif 613e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany 6146866dba92ac842fc513ba339ba849a953ffb7507Dmitry Vyukov if (common_flags()->verbosity) 615e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany PrintAddressSpaceLayout(); 6161e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 617cb8c4dce691097718d5af41b36899b72ef4b1d84Alexey Samsonov if (flags()->disable_core) { 618be7420cc79d8580eb354666eef638d39ee9cff80Alexey Samsonov DisableCoreDumper(); 6191e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany } 6201e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 621e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany if (full_shadow_is_available) { 622e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany // mmap the low shadow plus at least one page at the left. 623e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany if (kLowShadowBeg) 624e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany ReserveShadowMemoryRange(shadow_start, kLowShadowEnd); 625e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany // mmap the high shadow. 626e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany ReserveShadowMemoryRange(kHighShadowBeg, kHighShadowEnd); 627e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany // protect the gap. 628e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany ProtectGap(kShadowGapBeg, kShadowGapEnd - kShadowGapBeg + 1); 6292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CHECK_EQ(kShadowGapEnd, kHighShadowBeg - 1); 630e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany } else if (kMidMemBeg && 631e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany MemoryRangeIsAvailable(shadow_start, kMidMemBeg - 1) && 632bb7f2d880c843dd5ee1c5e53d2517f7ca9058e66Timur Iskhodzhanov MemoryRangeIsAvailable(kMidMemEnd + 1, kHighShadowEnd)) { 633e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany CHECK(kLowShadowBeg != kLowShadowEnd); 634e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany // mmap the low shadow plus at least one page at the left. 635e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany ReserveShadowMemoryRange(shadow_start, kLowShadowEnd); 636e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany // mmap the mid shadow. 637e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany ReserveShadowMemoryRange(kMidShadowBeg, kMidShadowEnd); 638a7e760a53bc43b8e09bfdf5cd6f215267ba99729Kostya Serebryany // mmap the high shadow. 639a7e760a53bc43b8e09bfdf5cd6f215267ba99729Kostya Serebryany ReserveShadowMemoryRange(kHighShadowBeg, kHighShadowEnd); 640e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany // protect the gaps. 641e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany ProtectGap(kShadowGapBeg, kShadowGapEnd - kShadowGapBeg + 1); 642e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany ProtectGap(kShadowGap2Beg, kShadowGap2End - kShadowGap2Beg + 1); 643e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany ProtectGap(kShadowGap3Beg, kShadowGap3End - kShadowGap3Beg + 1); 644c50e83576323d93433086b4c751f1746597a4286Alexander Potapenko } else { 645c50e83576323d93433086b4c751f1746597a4286Alexander Potapenko Report("Shadow memory range interleaves with an existing memory mapping. " 646c50e83576323d93433086b4c751f1746597a4286Alexander Potapenko "ASan cannot proceed correctly. ABORTING.\n"); 647be7420cc79d8580eb354666eef638d39ee9cff80Alexey Samsonov DumpProcessMap(); 64847657ce6cbac2fa93d0fd765c5d2872443b50e87Alexey Samsonov Die(); 6491e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany } 6501e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 65113521a267f509a06e92baa154947b9d2cde0eed8Kostya Serebryany AsanTSDInit(PlatformTSDDtor); 6522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines InstallDeadlySignalHandlers(AsanOnSIGSEGV); 653d64bcf43935c9ceeb7376ca4185662811ae907eaAlexey Samsonov 654d64bcf43935c9ceeb7376ca4185662811ae907eaAlexey Samsonov // Allocator should be initialized before starting external symbolizer, as 655d64bcf43935c9ceeb7376ca4185662811ae907eaAlexey Samsonov // fork() on Mac locks the allocator. 656d64bcf43935c9ceeb7376ca4185662811ae907eaAlexey Samsonov InitializeAllocator(); 657d64bcf43935c9ceeb7376ca4185662811ae907eaAlexey Samsonov 6582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines Symbolizer::Init(common_flags()->external_symbolizer_path); 659f03d8afc8b8dd072c4e2884a7475ee28ac5f3f41Alexander Potapenko 6601e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // On Linux AsanThread::ThreadStart() calls malloc() that's why asan_inited 6611e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // should be set to 1 prior to initializing the threads. 6621e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany asan_inited = 1; 6631e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany asan_init_is_running = false; 6641e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 665a2e70d92b67703effb631d7b4db8979fd74d5db5Kostya Serebryany if (flags()->atexit) 666a2e70d92b67703effb631d7b4db8979fd74d5db5Kostya Serebryany Atexit(asan_atexit); 667a2e70d92b67703effb631d7b4db8979fd74d5db5Kostya Serebryany 6682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (common_flags()->coverage) { 6692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __sanitizer_cov_init(); 670dbd69cc9ccda50efd0305cd0ce9bad50defe4b42Bob Wilson Atexit(__sanitizer_cov_dump); 6712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 672dbd69cc9ccda50efd0305cd0ce9bad50defe4b42Bob Wilson 673a2e70d92b67703effb631d7b4db8979fd74d5db5Kostya Serebryany // interceptors 67412d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveev InitTlsSize(); 67512d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveev 676def1be9b7ef4091ce465c0fbfb26cdb52128ade8Alexey Samsonov // Create main thread. 677def1be9b7ef4091ce465c0fbfb26cdb52128ade8Alexey Samsonov AsanThread *main_thread = AsanThread::Create(0, 0); 678def1be9b7ef4091ce465c0fbfb26cdb52128ade8Alexey Samsonov CreateThreadContextArgs create_main_args = { main_thread, 0 }; 679def1be9b7ef4091ce465c0fbfb26cdb52128ade8Alexey Samsonov u32 main_tid = asanThreadRegistry().CreateThread( 680def1be9b7ef4091ce465c0fbfb26cdb52128ade8Alexey Samsonov 0, true, 0, &create_main_args); 681def1be9b7ef4091ce465c0fbfb26cdb52128ade8Alexey Samsonov CHECK_EQ(0, main_tid); 682def1be9b7ef4091ce465c0fbfb26cdb52128ade8Alexey Samsonov SetCurrentThread(main_thread); 6830b694fcab9b2f33bdd6691cbea4e80a5c27191b1Peter Collingbourne main_thread->ThreadStart(internal_getpid()); 68451e75c45a6886455a5bdb91c0951bc77dd2c47a2Kostya Serebryany force_interface_symbols(); // no-op. 6852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines SanitizerInitializeUnwinder(); 6861e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 687975a3294d9baf6bbbcfdb3c3a0e0a24714cde7cbAlexey Samsonov#if CAN_SANITIZE_LEAKS 68871f0411c8289b57bc1a2cb3ccc02ae7fae25fd33Sergey Matveev __lsan::InitCommonLsan(); 68941f15402521b7af66c2aa8e0ad4a056fc8166dd9Sergey Matveev if (common_flags()->detect_leaks && common_flags()->leak_check_at_exit) { 6904cacb4f6fb6127099fa5a816b12b2565e5bed4feSergey Matveev Atexit(__lsan::DoLeakCheck); 6914cacb4f6fb6127099fa5a816b12b2565e5bed4feSergey Matveev } 692975a3294d9baf6bbbcfdb3c3a0e0a24714cde7cbAlexey Samsonov#endif // CAN_SANITIZE_LEAKS 69371f0411c8289b57bc1a2cb3ccc02ae7fae25fd33Sergey Matveev 6942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines VReport(1, "AddressSanitizer Init done\n"); 6952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 6962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 6972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// Initialize as requested from some part of ASan runtime library (interceptors, 6982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// allocator, etc). 6992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid AsanInitFromRtl() { 7002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines AsanInitInternal(); 7012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 7022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 7032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#if ASAN_DYNAMIC 7042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// Initialize runtime in case it's LD_PRELOAD-ed into unsanitized executable 7052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// (and thus normal initializer from .preinit_array haven't run). 7062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 7072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesclass AsanInitializer { 7082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinespublic: // NOLINT 7092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines AsanInitializer() { 7102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines AsanCheckIncompatibleRT(); 7112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines AsanCheckDynamicRTPrereqs(); 7122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (UNLIKELY(!asan_inited)) 7132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __asan_init(); 7142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 7152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}; 7162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 7172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesstatic AsanInitializer asan_initializer; 7182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif // ASAN_DYNAMIC 7192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 7202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} // namespace __asan 7212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 7222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// ---------------------- Interface ---------------- {{{1 7232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesusing namespace __asan; // NOLINT 7242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 7252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#if !SANITIZER_SUPPORTS_WEAK_HOOKS 7262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesextern "C" { 7272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesSANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE 7282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesconst char* __asan_default_options() { return ""; } 7292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} // extern "C" 7302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif 7312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 7322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint NOINLINE __asan_set_error_exit_code(int exit_code) { 7332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int old = flags()->exitcode; 7342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines flags()->exitcode = exit_code; 7352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return old; 7362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 7372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 7382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid NOINLINE __asan_handle_no_return() { 7392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int local_stack; 7402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines AsanThread *curr_thread = GetCurrentThread(); 7412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CHECK(curr_thread); 7422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uptr PageSize = GetPageSizeCached(); 7432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uptr top = curr_thread->stack_top(); 7442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uptr bottom = ((uptr)&local_stack - PageSize) & ~(PageSize-1); 7452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines static const uptr kMaxExpectedCleanupSize = 64 << 20; // 64M 7462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (top - bottom > kMaxExpectedCleanupSize) { 7472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines static bool reported_warning = false; 7482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (reported_warning) 7492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return; 7502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines reported_warning = true; 7512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines Report("WARNING: ASan is ignoring requested __asan_handle_no_return: " 7522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "stack top: %p; bottom %p; size: %p (%zd)\n" 7532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "False positive error reports may follow\n" 7542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "For details see " 7552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "http://code.google.com/p/address-sanitizer/issues/detail?id=189\n", 7562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines top, bottom, top - bottom, top - bottom); 7572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return; 7581e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany } 7592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines PoisonShadow(bottom, top - bottom, 0); 7602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (curr_thread->has_fake_stack()) 7612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines curr_thread->fake_stack()->HandleNoReturn(); 7622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 7632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 7642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid NOINLINE __asan_set_death_callback(void (*callback)(void)) { 7652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines death_callback = callback; 7662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 7672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 7682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// Initialize as requested from instrumented application code. 7692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// We use this call as a trigger to wake up ASan from deactivated state. 7702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid __asan_init() { 7712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines AsanCheckIncompatibleRT(); 7722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines AsanActivate(); 7732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines AsanInitInternal(); 7741e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} 775