Home | History | Annotate | Download | only in docs
      1 ================
      2 AddressSanitizer
      3 ================
      4 
      5 .. contents::
      6    :local:
      7 
      8 Introduction
      9 ============
     10 
     11 AddressSanitizer is a fast memory error detector. It consists of a compiler
     12 instrumentation module and a run-time library. The tool can detect the
     13 following types of bugs:
     14 
     15 * Out-of-bounds accesses to heap, stack and globals
     16 * Use-after-free
     17 * Use-after-return (to some extent)
     18 * Double-free, invalid free
     19 
     20 Typical slowdown introduced by AddressSanitizer is **2x**.
     21 
     22 How to build
     23 ============
     24 
     25 Follow the `clang build instructions <../get_started.html>`_. CMake build is
     26 supported.
     27 
     28 Usage
     29 =====
     30 
     31 Simply compile and link your program with ``-fsanitize=address`` flag.  The
     32 AddressSanitizer run-time library should be linked to the final executable, so
     33 make sure to use ``clang`` (not ``ld``) for the final link step.  When linking
     34 shared libraries, the AddressSanitizer run-time is not linked, so
     35 ``-Wl,-z,defs`` may cause link errors (don't use it with AddressSanitizer).  To
     36 get a reasonable performance add ``-O1`` or higher.  To get nicer stack traces
     37 in error messages add ``-fno-omit-frame-pointer``.  To get perfect stack traces
     38 you may need to disable inlining (just use ``-O1``) and tail call elimination
     39 (``-fno-optimize-sibling-calls``).
     40 
     41 .. code-block:: console
     42 
     43     % cat example_UseAfterFree.cc
     44     int main(int argc, char **argv) {
     45       int *array = new int[100];
     46       delete [] array;
     47       return array[argc];  // BOOM
     48     }
     49 
     50     # Compile and link
     51     % clang -O1 -g -fsanitize=address -fno-omit-frame-pointer example_UseAfterFree.cc
     52 
     53 or:
     54 
     55 .. code-block:: console
     56 
     57     # Compile
     58     % clang -O1 -g -fsanitize=address -fno-omit-frame-pointer -c example_UseAfterFree.cc
     59     # Link
     60     % clang -g -fsanitize=address example_UseAfterFree.o
     61 
     62 If a bug is detected, the program will print an error message to stderr and
     63 exit with a non-zero exit code. Currently, AddressSanitizer does not symbolize
     64 its output, so you may need to use a separate script to symbolize the result
     65 offline (this will be fixed in future).
     66 
     67 .. code-block:: console
     68 
     69     % ./a.out 2> log
     70     % projects/compiler-rt/lib/asan/scripts/asan_symbolize.py / < log | c++filt
     71     ==9442== ERROR: AddressSanitizer heap-use-after-free on address 0x7f7ddab8c084 at pc 0x403c8c bp 0x7fff87fb82d0 sp 0x7fff87fb82c8
     72     READ of size 4 at 0x7f7ddab8c084 thread T0
     73         #0 0x403c8c in main example_UseAfterFree.cc:4
     74         #1 0x7f7ddabcac4d in __libc_start_main ??:0
     75     0x7f7ddab8c084 is located 4 bytes inside of 400-byte region [0x7f7ddab8c080,0x7f7ddab8c210)
     76     freed by thread T0 here:
     77         #0 0x404704 in operator delete[](void*) ??:0
     78         #1 0x403c53 in main example_UseAfterFree.cc:4
     79         #2 0x7f7ddabcac4d in __libc_start_main ??:0
     80     previously allocated by thread T0 here:
     81         #0 0x404544 in operator new[](unsigned long) ??:0
     82         #1 0x403c43 in main example_UseAfterFree.cc:2
     83         #2 0x7f7ddabcac4d in __libc_start_main ??:0
     84     ==9442== ABORTING
     85 
     86 AddressSanitizer exits on the first detected error. This is by design.
     87 One reason: it makes the generated code smaller and faster (both by
     88 ~5%). Another reason: this makes fixing bugs unavoidable. With Valgrind,
     89 it is often the case that users treat Valgrind warnings as false
     90 positives (which they are not) and don't fix them.
     91 
     92 ``__has_feature(address_sanitizer)``
     93 ------------------------------------
     94 
     95 In some cases one may need to execute different code depending on whether
     96 AddressSanitizer is enabled.
     97 :ref:`\_\_has\_feature <langext-__has_feature-__has_extension>` can be used for
     98 this purpose.
     99 
    100 .. code-block:: c
    101 
    102     #if defined(__has_feature)
    103     #  if __has_feature(address_sanitizer)
    104     // code that builds only under AddressSanitizer
    105     #  endif
    106     #endif
    107 
    108 ``__attribute__((no_sanitize_address))``
    109 -----------------------------------------------
    110 
    111 Some code should not be instrumented by AddressSanitizer. One may use the
    112 function attribute
    113 :ref:`no_sanitize_address <langext-address_sanitizer>`
    114 (or a deprecated synonym `no_address_safety_analysis`)
    115 to disable instrumentation of a particular function. This attribute may not be
    116 supported by other compilers, so we suggest to use it together with
    117 ``__has_feature(address_sanitizer)``. Note: currently, this attribute will be
    118 lost if the function is inlined.
    119 
    120 Initialization order checking
    121 -----------------------------
    122 
    123 AddressSanitizer can optionally detect dynamic initialization order problems,
    124 when initialization of globals defined in one translation unit uses
    125 globals defined in another translation unit. To enable this check at runtime,
    126 you should set environment variable
    127 ``ASAN_OPTIONS=check_initialization_order=1``.
    128 
    129 Blacklist
    130 ---------
    131 
    132 AddressSanitizer supports ``src`` and ``fun`` entity types in
    133 :doc:`SanitizerSpecialCaseList`, that can be used to suppress error reports
    134 in the specified source files or functions. Additionally, AddressSanitizer
    135 introduces ``global`` and ``type`` entity types that can be used to
    136 suppress error reports for out-of-bound access to globals with certain
    137 names and types (you may only specify class or struct types).
    138 
    139 You may use an ``init`` category to suppress reports about initialization-order
    140 problems happening in certain source files or with certain global variables.
    141 
    142 .. code-block:: bash
    143 
    144     # Suppress error reports for code in a file or in a function:
    145     src:bad_file.cpp
    146     # Ignore all functions with names containing MyFooBar:
    147     fun:*MyFooBar*
    148     # Disable out-of-bound checks for global:
    149     global:bad_array
    150     # Disable out-of-bound checks for global instances of a given class ...
    151     type:class.Namespace::BadClassName
    152     # ... or a given struct. Use wildcard to deal with anonymous namespace.
    153     type:struct.Namespace2::*::BadStructName
    154     # Disable initialization-order checks for globals:
    155     global:bad_init_global=init
    156     type:*BadInitClassSubstring*=init
    157     src:bad/init/files/*=init
    158 
    159 Supported Platforms
    160 ===================
    161 
    162 AddressSanitizer is supported on
    163 
    164 * Linux i386/x86\_64 (tested on Ubuntu 10.04 and 12.04);
    165 * MacOS 10.6, 10.7 and 10.8 (i386/x86\_64).
    166 
    167 Support for Linux ARM (and Android ARM) is in progress (it may work, but
    168 is not guaranteed too).
    169 
    170 Limitations
    171 ===========
    172 
    173 * AddressSanitizer uses more real memory than a native run. Exact overhead
    174   depends on the allocations sizes. The smaller the allocations you make the
    175   bigger the overhead is.
    176 * AddressSanitizer uses more stack memory. We have seen up to 3x increase.
    177 * On 64-bit platforms AddressSanitizer maps (but not reserves) 16+ Terabytes of
    178   virtual address space. This means that tools like ``ulimit`` may not work as
    179   usually expected.
    180 * Static linking is not supported.
    181 
    182 Current Status
    183 ==============
    184 
    185 AddressSanitizer is fully functional on supported platforms starting from LLVM
    186 3.1. The test suite is integrated into CMake build and can be run with ``make
    187 check-asan`` command.
    188 
    189 More Information
    190 ================
    191 
    192 `http://code.google.com/p/address-sanitizer <http://code.google.com/p/address-sanitizer/>`_
    193 
    194