blob: 57cb4fe7c8c0616153f2d1bea05e4707d6cebdc1 [file] [log] [blame]
Sean Silva93ca0212012-12-13 01:10:46 +00001================
2AddressSanitizer
3================
4
5.. contents::
6 :local:
7
8Introduction
9============
10
Dmitri Gribenko97555a12012-12-15 21:10:51 +000011AddressSanitizer is a fast memory error detector. It consists of a compiler
12instrumentation module and a run-time library. The tool can detect the
13following types of bugs:
Sean Silva93ca0212012-12-13 01:10:46 +000014
Dmitri Gribenko97555a12012-12-15 21:10:51 +000015* 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
Sean Silva93ca0212012-12-13 01:10:46 +000019
20Typical slowdown introduced by AddressSanitizer is **2x**.
21
22How to build
23============
24
Dmitri Gribenko97555a12012-12-15 21:10:51 +000025Follow the `clang build instructions <../get_started.html>`_. CMake build is
26supported.
Sean Silva93ca0212012-12-13 01:10:46 +000027
28Usage
29=====
30
Dmitri Gribenko97555a12012-12-15 21:10:51 +000031Simply compile and link your program with ``-fsanitize=address`` flag. The
32AddressSanitizer run-time library should be linked to the final executable, so
33make sure to use ``clang`` (not ``ld``) for the final link step. When linking
34shared libraries, the AddressSanitizer run-time is not linked, so
35``-Wl,-z,defs`` may cause link errors (don't use it with AddressSanitizer). To
36get a reasonable performance add ``-O1`` or higher. To get nicer stack traces
37in error messages add ``-fno-omit-frame-pointer``. To get perfect stack traces
38you may need to disable inlining (just use ``-O1``) and tail call elimination
39(``-fno-optimize-sibling-calls``).
Sean Silva93ca0212012-12-13 01:10:46 +000040
Dmitri Gribenko97555a12012-12-15 21:10:51 +000041.. code-block:: console
Sean Silva93ca0212012-12-13 01:10:46 +000042
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
Sean Silva93ca0212012-12-13 01:10:46 +000050 # Compile and link
51 % clang -O1 -g -fsanitize=address -fno-omit-frame-pointer example_UseAfterFree.cc
52
Dmitri Gribenko97555a12012-12-15 21:10:51 +000053or:
Sean Silva93ca0212012-12-13 01:10:46 +000054
Dmitri Gribenko97555a12012-12-15 21:10:51 +000055.. code-block:: console
Sean Silva93ca0212012-12-13 01:10:46 +000056
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
Dmitri Gribenko97555a12012-12-15 21:10:51 +000062If a bug is detected, the program will print an error message to stderr and
63exit with a non-zero exit code. Currently, AddressSanitizer does not symbolize
64its output, so you may need to use a separate script to symbolize the result
65offline (this will be fixed in future).
Sean Silva93ca0212012-12-13 01:10:46 +000066
Dmitri Gribenko97555a12012-12-15 21:10:51 +000067.. code-block:: console
Sean Silva93ca0212012-12-13 01:10:46 +000068
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
86AddressSanitizer exits on the first detected error. This is by design.
87One reason: it makes the generated code smaller and faster (both by
88~5%). Another reason: this makes fixing bugs unavoidable. With Valgrind,
89it is often the case that users treat Valgrind warnings as false
90positives (which they are not) and don't fix them.
91
Dmitri Gribenko97555a12012-12-15 21:10:51 +000092``__has_feature(address_sanitizer)``
Sean Silva93ca0212012-12-13 01:10:46 +000093------------------------------------
94
Dmitri Gribenko97555a12012-12-15 21:10:51 +000095In some cases one may need to execute different code depending on whether
96AddressSanitizer is enabled.
97:ref:`\_\_has\_feature <langext-__has_feature-__has_extension>` can be used for
98this purpose.
Sean Silva93ca0212012-12-13 01:10:46 +000099
Dmitri Gribenko97555a12012-12-15 21:10:51 +0000100.. code-block:: c
Sean Silva93ca0212012-12-13 01:10:46 +0000101
102 #if defined(__has_feature)
Dmitri Gribenko97555a12012-12-15 21:10:51 +0000103 # if __has_feature(address_sanitizer)
104 // code that builds only under AddressSanitizer
105 # endif
Sean Silva93ca0212012-12-13 01:10:46 +0000106 #endif
107
Kostya Serebryany85aee962013-02-26 06:58:27 +0000108``__attribute__((no_sanitize_address))``
Dmitri Gribenko97555a12012-12-15 21:10:51 +0000109-----------------------------------------------
Sean Silva93ca0212012-12-13 01:10:46 +0000110
Dmitri Gribenko97555a12012-12-15 21:10:51 +0000111Some code should not be instrumented by AddressSanitizer. One may use the
112function attribute
Kostya Serebryany85aee962013-02-26 06:58:27 +0000113:ref:`no_sanitize_address <langext-address_sanitizer>`
114(or a deprecated synonym `no_address_safety_analysis`)
Dmitri Gribenko97555a12012-12-15 21:10:51 +0000115to disable instrumentation of a particular function. This attribute may not be
116supported by other compilers, so we suggest to use it together with
117``__has_feature(address_sanitizer)``. Note: currently, this attribute will be
118lost if the function is inlined.
Sean Silva93ca0212012-12-13 01:10:46 +0000119
Alexey Samsonovf37b1e22013-03-14 12:26:21 +0000120``Initialization order checking``
121---------------------------------
122
123AddressSanitizer can optionally detect dynamic initialization order problems,
124when initialization of globals defined in one translation unit uses
125globals defined in another translation unit. To enable this check at runtime,
126you should set environment variable
127``ASAN_OPTIONS=check_initialization_order=1``.
128
Sean Silva93ca0212012-12-13 01:10:46 +0000129Supported Platforms
130===================
131
132AddressSanitizer is supported on
133
Dmitri Gribenko97555a12012-12-15 21:10:51 +0000134* Linux i386/x86\_64 (tested on Ubuntu 10.04 and 12.04);
135* MacOS 10.6, 10.7 and 10.8 (i386/x86\_64).
Sean Silva93ca0212012-12-13 01:10:46 +0000136
137Support for Linux ARM (and Android ARM) is in progress (it may work, but
138is not guaranteed too).
139
140Limitations
141===========
142
Dmitri Gribenko97555a12012-12-15 21:10:51 +0000143* AddressSanitizer uses more real memory than a native run. Exact overhead
144 depends on the allocations sizes. The smaller the allocations you make the
145 bigger the overhead is.
146* AddressSanitizer uses more stack memory. We have seen up to 3x increase.
147* On 64-bit platforms AddressSanitizer maps (but not reserves) 16+ Terabytes of
148 virtual address space. This means that tools like ``ulimit`` may not work as
149 usually expected.
150* Static linking is not supported.
Sean Silva93ca0212012-12-13 01:10:46 +0000151
152Current Status
153==============
154
Dmitri Gribenko97555a12012-12-15 21:10:51 +0000155AddressSanitizer is fully functional on supported platforms starting from LLVM
1563.1. The test suite is integrated into CMake build and can be run with ``make
157check-asan`` command.
Sean Silva93ca0212012-12-13 01:10:46 +0000158
159More Information
160================
161
Dmitri Gribenko97555a12012-12-15 21:10:51 +0000162`http://code.google.com/p/address-sanitizer <http://code.google.com/p/address-sanitizer/>`_
163