annotate clang/tools/clang-fuzzer/README.txt @ 209:dd44ba33042e

merged...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 08 Jun 2021 06:36:09 +0900
parents 1d019706d866
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 This directory contains three utilities for fuzzing Clang: clang-fuzzer,
anatofuz
parents:
diff changeset
2 clang-objc-fuzzer, and clang-proto-fuzzer. All use libFuzzer to generate inputs
anatofuz
parents:
diff changeset
3 to clang via coverage-guided mutation.
anatofuz
parents:
diff changeset
4
anatofuz
parents:
diff changeset
5 The three utilities differ, however, in how they structure inputs to Clang.
anatofuz
parents:
diff changeset
6 clang-fuzzer makes no attempt to generate valid C++ programs and is therefore
anatofuz
parents:
diff changeset
7 primarily useful for stressing the surface layers of Clang (i.e. lexer, parser).
anatofuz
parents:
diff changeset
8
anatofuz
parents:
diff changeset
9 clang-objc-fuzzer is similar but for Objective-C: it makes no attempt to
anatofuz
parents:
diff changeset
10 generate a valid Objective-C program.
anatofuz
parents:
diff changeset
11
anatofuz
parents:
diff changeset
12 clang-proto-fuzzer uses a protobuf class to describe a subset of the C++
anatofuz
parents:
diff changeset
13 language and then uses libprotobuf-mutator to mutate instantiations of that
anatofuz
parents:
diff changeset
14 class, producing valid C++ programs in the process. As a result,
anatofuz
parents:
diff changeset
15 clang-proto-fuzzer is better at stressing deeper layers of Clang and LLVM.
anatofuz
parents:
diff changeset
16
anatofuz
parents:
diff changeset
17 Some of the fuzzers have example corpuses inside the corpus_examples directory.
anatofuz
parents:
diff changeset
18
anatofuz
parents:
diff changeset
19 ===================================
anatofuz
parents:
diff changeset
20 Building clang-fuzzer
anatofuz
parents:
diff changeset
21 ===================================
anatofuz
parents:
diff changeset
22 Within your LLVM build directory, run CMake with the following variable
anatofuz
parents:
diff changeset
23 definitions:
anatofuz
parents:
diff changeset
24 - CMAKE_C_COMPILER=clang
anatofuz
parents:
diff changeset
25 - CMAKE_CXX_COMPILER=clang++
anatofuz
parents:
diff changeset
26 - LLVM_USE_SANITIZE_COVERAGE=YES
anatofuz
parents:
diff changeset
27 - LLVM_USE_SANITIZER=Address
anatofuz
parents:
diff changeset
28
anatofuz
parents:
diff changeset
29 Then build the clang-fuzzer target.
anatofuz
parents:
diff changeset
30
anatofuz
parents:
diff changeset
31 Example:
anatofuz
parents:
diff changeset
32 cd $LLVM_SOURCE_DIR
anatofuz
parents:
diff changeset
33 mkdir build && cd build
anatofuz
parents:
diff changeset
34 cmake .. -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ \
anatofuz
parents:
diff changeset
35 -DLLVM_USE_SANITIZE_COVERAGE=YES -DLLVM_USE_SANITIZER=Address
anatofuz
parents:
diff changeset
36 ninja clang-fuzzer
anatofuz
parents:
diff changeset
37
anatofuz
parents:
diff changeset
38 ======================
anatofuz
parents:
diff changeset
39 Running clang-fuzzer
anatofuz
parents:
diff changeset
40 ======================
anatofuz
parents:
diff changeset
41 bin/clang-fuzzer CORPUS_DIR
anatofuz
parents:
diff changeset
42
anatofuz
parents:
diff changeset
43
anatofuz
parents:
diff changeset
44 ===================================
anatofuz
parents:
diff changeset
45 Building clang-objc-fuzzer
anatofuz
parents:
diff changeset
46 ===================================
anatofuz
parents:
diff changeset
47 Within your LLVM build directory, run CMake with the following variable
anatofuz
parents:
diff changeset
48 definitions:
anatofuz
parents:
diff changeset
49 - CMAKE_C_COMPILER=clang
anatofuz
parents:
diff changeset
50 - CMAKE_CXX_COMPILER=clang++
anatofuz
parents:
diff changeset
51 - LLVM_USE_SANITIZE_COVERAGE=YES
anatofuz
parents:
diff changeset
52 - LLVM_USE_SANITIZER=Address
anatofuz
parents:
diff changeset
53
anatofuz
parents:
diff changeset
54 Then build the clang-objc-fuzzer target.
anatofuz
parents:
diff changeset
55
anatofuz
parents:
diff changeset
56 Example:
anatofuz
parents:
diff changeset
57 cd $LLVM_SOURCE_DIR
anatofuz
parents:
diff changeset
58 mkdir build && cd build
anatofuz
parents:
diff changeset
59 cmake .. -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ \
anatofuz
parents:
diff changeset
60 -DLLVM_USE_SANITIZE_COVERAGE=YES -DLLVM_USE_SANITIZER=Address
anatofuz
parents:
diff changeset
61 ninja clang-objc-fuzzer
anatofuz
parents:
diff changeset
62
anatofuz
parents:
diff changeset
63 ======================
anatofuz
parents:
diff changeset
64 Running clang-objc-fuzzer
anatofuz
parents:
diff changeset
65 ======================
anatofuz
parents:
diff changeset
66 bin/clang-objc-fuzzer CORPUS_DIR
anatofuz
parents:
diff changeset
67
anatofuz
parents:
diff changeset
68 e.g. using the example objc corpus,
anatofuz
parents:
diff changeset
69
anatofuz
parents:
diff changeset
70 bin/clang-objc-fuzzer <path to corpus_examples/objc> <path to new directory to store corpus findings>
anatofuz
parents:
diff changeset
71
anatofuz
parents:
diff changeset
72
anatofuz
parents:
diff changeset
73 =======================================================
anatofuz
parents:
diff changeset
74 Building clang-proto-fuzzer (Linux-only instructions)
anatofuz
parents:
diff changeset
75 =======================================================
anatofuz
parents:
diff changeset
76 Install the necessary dependencies:
anatofuz
parents:
diff changeset
77 - binutils // needed for libprotobuf-mutator
anatofuz
parents:
diff changeset
78 - liblzma-dev // needed for libprotobuf-mutator
anatofuz
parents:
diff changeset
79 - libz-dev // needed for libprotobuf-mutator
anatofuz
parents:
diff changeset
80 - docbook2x // needed for libprotobuf-mutator
anatofuz
parents:
diff changeset
81 - Recent version of protobuf [3.3.0 is known to work]
anatofuz
parents:
diff changeset
82
anatofuz
parents:
diff changeset
83 Within your LLVM build directory, run CMake with the following variable
anatofuz
parents:
diff changeset
84 definitions:
anatofuz
parents:
diff changeset
85 - CMAKE_C_COMPILER=clang
anatofuz
parents:
diff changeset
86 - CMAKE_CXX_COMPILER=clang++
anatofuz
parents:
diff changeset
87 - LLVM_USE_SANITIZE_COVERAGE=YES
anatofuz
parents:
diff changeset
88 - LLVM_USE_SANITIZER=Address
anatofuz
parents:
diff changeset
89 - CLANG_ENABLE_PROTO_FUZZER=ON
anatofuz
parents:
diff changeset
90
anatofuz
parents:
diff changeset
91 Then build the clang-proto-fuzzer and clang-proto-to-cxx targets. Optionally,
anatofuz
parents:
diff changeset
92 you may also build clang-fuzzer with this setup.
anatofuz
parents:
diff changeset
93
anatofuz
parents:
diff changeset
94 Example:
anatofuz
parents:
diff changeset
95 cd $LLVM_SOURCE_DIR
anatofuz
parents:
diff changeset
96 mkdir build && cd build
anatofuz
parents:
diff changeset
97 cmake .. -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ \
anatofuz
parents:
diff changeset
98 -DLLVM_USE_SANITIZE_COVERAGE=YES -DLLVM_USE_SANITIZER=Address \
anatofuz
parents:
diff changeset
99 -DCLANG_ENABLE_PROTO_FUZZER=ON
anatofuz
parents:
diff changeset
100 ninja clang-proto-fuzzer clang-proto-to-cxx
anatofuz
parents:
diff changeset
101
anatofuz
parents:
diff changeset
102 This directory also contains a Dockerfile which sets up all required
anatofuz
parents:
diff changeset
103 dependencies and builds the fuzzers.
anatofuz
parents:
diff changeset
104
anatofuz
parents:
diff changeset
105 ============================
anatofuz
parents:
diff changeset
106 Running clang-proto-fuzzer
anatofuz
parents:
diff changeset
107 ============================
anatofuz
parents:
diff changeset
108 bin/clang-proto-fuzzer CORPUS_DIR
anatofuz
parents:
diff changeset
109
anatofuz
parents:
diff changeset
110 Arguments can be specified after -ignore_remaining_args=1 to modify the compiler
anatofuz
parents:
diff changeset
111 invocation. For example, the following command line will fuzz LLVM with a
anatofuz
parents:
diff changeset
112 custom optimization level and target triple:
anatofuz
parents:
diff changeset
113 bin/clang-proto-fuzzer CORPUS_DIR -ignore_remaining_args=1 -O3 -triple \
anatofuz
parents:
diff changeset
114 arm64apple-ios9
anatofuz
parents:
diff changeset
115
anatofuz
parents:
diff changeset
116 To translate a clang-proto-fuzzer corpus output to C++:
anatofuz
parents:
diff changeset
117 bin/clang-proto-to-cxx CORPUS_OUTPUT_FILE
anatofuz
parents:
diff changeset
118
anatofuz
parents:
diff changeset
119 ===================
anatofuz
parents:
diff changeset
120 llvm-proto-fuzzer
anatofuz
parents:
diff changeset
121 ===================
anatofuz
parents:
diff changeset
122 Like, clang-proto-fuzzer, llvm-proto-fuzzer is also a protobuf-mutator based
anatofuz
parents:
diff changeset
123 fuzzer. It receives as input a cxx_loop_proto which it then converts into a
anatofuz
parents:
diff changeset
124 string of valid LLVM IR: a function with either a single loop or two nested
anatofuz
parents:
diff changeset
125 loops. It then creates a new string of IR by running optimization passes over
anatofuz
parents:
diff changeset
126 the original IR. Currently, it only runs a loop-vectorize pass but more passes
anatofuz
parents:
diff changeset
127 can easily be added to the fuzzer. Once there are two versions of the input
anatofuz
parents:
diff changeset
128 function (optimized and not), llvm-proto-fuzzer uses LLVM's JIT Engine to
anatofuz
parents:
diff changeset
129 compile both functions. Lastly, it runs both functions on a suite of inputs and
anatofuz
parents:
diff changeset
130 checks that both functions behave the same on all inputs. In this way,
anatofuz
parents:
diff changeset
131 llvm-proto-fuzzer can find not only compiler crashes, but also miscompiles
anatofuz
parents:
diff changeset
132 originating from LLVM's optimization passes.
anatofuz
parents:
diff changeset
133
anatofuz
parents:
diff changeset
134 llvm-proto-fuzzer is built very similarly to clang-proto-fuzzer. You can run the
anatofuz
parents:
diff changeset
135 fuzzer with the following command:
anatofuz
parents:
diff changeset
136 bin/clang-llvm-proto-fuzzer CORPUS_DIR
anatofuz
parents:
diff changeset
137
anatofuz
parents:
diff changeset
138 To translate a cxx_loop_proto file into LLVM IR do:
anatofuz
parents:
diff changeset
139 bin/clang-loop-proto-to-llvm CORPUS_OUTPUT_FILE
anatofuz
parents:
diff changeset
140 To translate a cxx_loop_proto file into C++ do:
anatofuz
parents:
diff changeset
141 bin/clang-loop-proto-to-cxx CORPUS_OUTPUT_FILE
anatofuz
parents:
diff changeset
142
anatofuz
parents:
diff changeset
143 Note: To get a higher number of executions per second with llvm-proto-fuzzer it
anatofuz
parents:
diff changeset
144 helps to build it without ASan instrumentation and with the -O2 flag. Because
anatofuz
parents:
diff changeset
145 the fuzzer is not only compiling code, but also running it, as the inputs get
anatofuz
parents:
diff changeset
146 large, the time necessary to fuzz one input can get very high.
anatofuz
parents:
diff changeset
147 Example:
anatofuz
parents:
diff changeset
148 cmake .. -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ \
anatofuz
parents:
diff changeset
149 -DCLANG_ENABLE_PROTO_FUZZER=ON -DLLVM_USE_SANITIZE_COVERAGE=YES \
anatofuz
parents:
diff changeset
150 -DCMAKE_CXX_FLAGS="-O2"
anatofuz
parents:
diff changeset
151 ninja clang-llvm-proto-fuzzer clang-loop-proto-to-llvm