| OLD | NEW |
| 1 /* | 1 /* |
| 2 american fuzzy lop - LLVM-mode wrapper for clang | 2 american fuzzy lop - LLVM-mode wrapper for clang |
| 3 ------------------------------------------------ | 3 ------------------------------------------------ |
| 4 | 4 |
| 5 Written by Laszlo Szekeres <lszekeres@google.com> and | 5 Written by Laszlo Szekeres <lszekeres@google.com> and |
| 6 Michal Zalewski <lcamtuf@google.com> | 6 Michal Zalewski <lcamtuf@google.com> |
| 7 | 7 |
| 8 LLVM integration design comes from Laszlo Szekeres. | 8 LLVM integration design comes from Laszlo Szekeres. |
| 9 | 9 |
| 10 Copyright 2015, 2016 Google Inc. All rights reserved. | 10 Copyright 2015, 2016 Google Inc. All rights reserved. |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 107 if (!strcmp(name, "afl-clang-fast++")) { | 107 if (!strcmp(name, "afl-clang-fast++")) { |
| 108 u8* alt_cxx = getenv("AFL_CXX"); | 108 u8* alt_cxx = getenv("AFL_CXX"); |
| 109 cc_params[0] = alt_cxx ? alt_cxx : (u8*)"clang++"; | 109 cc_params[0] = alt_cxx ? alt_cxx : (u8*)"clang++"; |
| 110 } else { | 110 } else { |
| 111 u8* alt_cc = getenv("AFL_CC"); | 111 u8* alt_cc = getenv("AFL_CC"); |
| 112 cc_params[0] = alt_cc ? alt_cc : (u8*)"clang"; | 112 cc_params[0] = alt_cc ? alt_cc : (u8*)"clang"; |
| 113 } | 113 } |
| 114 | 114 |
| 115 /* There are two ways to compile afl-clang-fast. In the traditional mode, we | 115 /* There are two ways to compile afl-clang-fast. In the traditional mode, we |
| 116 use afl-llvm-pass.so to inject instrumentation. In the experimental | 116 use afl-llvm-pass.so to inject instrumentation. In the experimental |
| 117 'trace-pc' mode, we use native LLVM instrumentation callbacks instead. | 117 'trace-pc-guard' mode, we use native LLVM instrumentation callbacks |
| 118 The latter is a very recent addition - see: | 118 instead. The latter is a very recent addition - see: |
| 119 | 119 |
| 120 http://clang.llvm.org/docs/SanitizerCoverage.html#tracing-pcs */ | 120 http://clang.llvm.org/docs/SanitizerCoverage.html#tracing-pcs-with-guards *
/ |
| 121 | 121 |
| 122 #ifdef USE_TRACE_PC | 122 #ifdef USE_TRACE_PC |
| 123 cc_params[cc_par_cnt++] = "-fsanitize-coverage=bb,trace-pc"; | 123 cc_params[cc_par_cnt++] = "-fsanitize-coverage=trace-pc-guard"; |
| 124 cc_params[cc_par_cnt++] = "-mllvm"; |
| 125 cc_params[cc_par_cnt++] = "-sanitizer-coverage-block-threshold=0"; |
| 124 #else | 126 #else |
| 125 cc_params[cc_par_cnt++] = "-Xclang"; | 127 cc_params[cc_par_cnt++] = "-Xclang"; |
| 126 cc_params[cc_par_cnt++] = "-load"; | 128 cc_params[cc_par_cnt++] = "-load"; |
| 127 cc_params[cc_par_cnt++] = "-Xclang"; | 129 cc_params[cc_par_cnt++] = "-Xclang"; |
| 128 cc_params[cc_par_cnt++] = alloc_printf("%s/afl-llvm-pass.so", obj_path); | 130 cc_params[cc_par_cnt++] = alloc_printf("%s/afl-llvm-pass.so", obj_path); |
| 129 #endif /* ^USE_TRACE_PC */ | 131 #endif /* ^USE_TRACE_PC */ |
| 130 | 132 |
| 131 cc_params[cc_par_cnt++] = "-Qunused-arguments"; | 133 cc_params[cc_par_cnt++] = "-Qunused-arguments"; |
| 132 | 134 |
| 133 /* Detect stray -v calls from ./configure scripts. */ | 135 /* Detect stray -v calls from ./configure scripts. */ |
| (...skipping 11 matching lines...) Expand all Loading... |
| 145 if (!strcmp(cur, "-c") || !strcmp(cur, "-S") || !strcmp(cur, "-E")) | 147 if (!strcmp(cur, "-c") || !strcmp(cur, "-S") || !strcmp(cur, "-E")) |
| 146 maybe_linking = 0; | 148 maybe_linking = 0; |
| 147 | 149 |
| 148 if (!strcmp(cur, "-fsanitize=address") || | 150 if (!strcmp(cur, "-fsanitize=address") || |
| 149 !strcmp(cur, "-fsanitize=memory")) asan_set = 1; | 151 !strcmp(cur, "-fsanitize=memory")) asan_set = 1; |
| 150 | 152 |
| 151 if (strstr(cur, "FORTIFY_SOURCE")) fortify_set = 1; | 153 if (strstr(cur, "FORTIFY_SOURCE")) fortify_set = 1; |
| 152 | 154 |
| 153 if (!strcmp(cur, "-shared")) maybe_linking = 0; | 155 if (!strcmp(cur, "-shared")) maybe_linking = 0; |
| 154 | 156 |
| 157 if (!strcmp(cur, "-Wl,-z,defs") || |
| 158 !strcmp(cur, "-Wl,--no-undefined")) continue; |
| 159 |
| 155 cc_params[cc_par_cnt++] = cur; | 160 cc_params[cc_par_cnt++] = cur; |
| 156 | 161 |
| 157 } | 162 } |
| 158 | 163 |
| 159 if (getenv("AFL_HARDEN")) { | 164 if (getenv("AFL_HARDEN")) { |
| 160 | 165 |
| 161 cc_params[cc_par_cnt++] = "-fstack-protector-all"; | 166 cc_params[cc_par_cnt++] = "-fstack-protector-all"; |
| 162 | 167 |
| 163 if (!fortify_set) | 168 if (!fortify_set) |
| 164 cc_params[cc_par_cnt++] = "-D_FORTIFY_SOURCE=2"; | 169 cc_params[cc_par_cnt++] = "-D_FORTIFY_SOURCE=2"; |
| 165 | 170 |
| 166 } | 171 } |
| 167 | 172 |
| 168 if (!asan_set) { | 173 if (!asan_set) { |
| 169 | 174 |
| 170 if (getenv("AFL_USE_ASAN")) { | 175 if (getenv("AFL_USE_ASAN")) { |
| 171 | 176 |
| 172 cc_params[cc_par_cnt++] = "-fsanitize=address"; | |
| 173 | |
| 174 if (getenv("AFL_USE_MSAN")) | 177 if (getenv("AFL_USE_MSAN")) |
| 175 FATAL("ASAN and MSAN are mutually exclusive"); | 178 FATAL("ASAN and MSAN are mutually exclusive"); |
| 176 | 179 |
| 180 if (getenv("AFL_HARDEN")) |
| 181 FATAL("ASAN and AFL_HARDEN are mutually exclusive"); |
| 182 |
| 183 cc_params[cc_par_cnt++] = "-U_FORTIFY_SOURCE"; |
| 184 cc_params[cc_par_cnt++] = "-fsanitize=address"; |
| 185 |
| 177 } else if (getenv("AFL_USE_MSAN")) { | 186 } else if (getenv("AFL_USE_MSAN")) { |
| 178 | 187 |
| 179 cc_params[cc_par_cnt++] = "-fsanitize=memory"; | |
| 180 | |
| 181 if (getenv("AFL_USE_ASAN")) | 188 if (getenv("AFL_USE_ASAN")) |
| 182 FATAL("ASAN and MSAN are mutually exclusive"); | 189 FATAL("ASAN and MSAN are mutually exclusive"); |
| 183 | 190 |
| 191 if (getenv("AFL_HARDEN")) |
| 192 FATAL("MSAN and AFL_HARDEN are mutually exclusive"); |
| 193 |
| 194 cc_params[cc_par_cnt++] = "-U_FORTIFY_SOURCE"; |
| 195 cc_params[cc_par_cnt++] = "-fsanitize=memory"; |
| 196 |
| 184 } | 197 } |
| 185 | 198 |
| 186 } | 199 } |
| 187 | 200 |
| 188 #ifdef USE_TRACE_PC | 201 #ifdef USE_TRACE_PC |
| 189 | 202 |
| 190 if (getenv("AFL_INST_RATIO")) | 203 if (getenv("AFL_INST_RATIO")) |
| 191 FATAL("AFL_INST_RATIO not available at compile time with 'trace-pc'."); | 204 FATAL("AFL_INST_RATIO not available at compile time with 'trace-pc'."); |
| 192 | 205 |
| 193 #endif /* USE_TRACE_PC */ | 206 #endif /* USE_TRACE_PC */ |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 332 | 345 |
| 333 edit_params(argc, argv); | 346 edit_params(argc, argv); |
| 334 | 347 |
| 335 execvp(cc_params[0], (char**)cc_params); | 348 execvp(cc_params[0], (char**)cc_params); |
| 336 | 349 |
| 337 FATAL("Oops, failed to execute '%s' - check your PATH", cc_params[0]); | 350 FATAL("Oops, failed to execute '%s' - check your PATH", cc_params[0]); |
| 338 | 351 |
| 339 return 0; | 352 return 0; |
| 340 | 353 |
| 341 } | 354 } |
| OLD | NEW |