1*08b48e0bSAndroid Build Coastguard Worker /*
2*08b48e0bSAndroid Build Coastguard Worker american fuzzy lop++ - stats related routines
3*08b48e0bSAndroid Build Coastguard Worker ---------------------------------------------
4*08b48e0bSAndroid Build Coastguard Worker
5*08b48e0bSAndroid Build Coastguard Worker Originally written by Michal Zalewski
6*08b48e0bSAndroid Build Coastguard Worker
7*08b48e0bSAndroid Build Coastguard Worker Now maintained by Marc Heuse <[email protected]>,
8*08b48e0bSAndroid Build Coastguard Worker Heiko Eißfeldt <[email protected]> and
9*08b48e0bSAndroid Build Coastguard Worker Andrea Fioraldi <[email protected]>
10*08b48e0bSAndroid Build Coastguard Worker
11*08b48e0bSAndroid Build Coastguard Worker Copyright 2016, 2017 Google Inc. All rights reserved.
12*08b48e0bSAndroid Build Coastguard Worker Copyright 2019-2024 AFLplusplus Project. All rights reserved.
13*08b48e0bSAndroid Build Coastguard Worker
14*08b48e0bSAndroid Build Coastguard Worker Licensed under the Apache License, Version 2.0 (the "License");
15*08b48e0bSAndroid Build Coastguard Worker you may not use this file except in compliance with the License.
16*08b48e0bSAndroid Build Coastguard Worker You may obtain a copy of the License at:
17*08b48e0bSAndroid Build Coastguard Worker
18*08b48e0bSAndroid Build Coastguard Worker https://www.apache.org/licenses/LICENSE-2.0
19*08b48e0bSAndroid Build Coastguard Worker
20*08b48e0bSAndroid Build Coastguard Worker This is the real deal: the program takes an instrumented binary and
21*08b48e0bSAndroid Build Coastguard Worker attempts a variety of basic fuzzing tricks, paying close attention to
22*08b48e0bSAndroid Build Coastguard Worker how they affect the execution path.
23*08b48e0bSAndroid Build Coastguard Worker
24*08b48e0bSAndroid Build Coastguard Worker */
25*08b48e0bSAndroid Build Coastguard Worker
26*08b48e0bSAndroid Build Coastguard Worker #include "afl-fuzz.h"
27*08b48e0bSAndroid Build Coastguard Worker #include "envs.h"
28*08b48e0bSAndroid Build Coastguard Worker #include <limits.h>
29*08b48e0bSAndroid Build Coastguard Worker
30*08b48e0bSAndroid Build Coastguard Worker static char fuzzing_state[4][12] = {"started :-)", "in progress", "final phase",
31*08b48e0bSAndroid Build Coastguard Worker "finished..."};
32*08b48e0bSAndroid Build Coastguard Worker
get_fuzzing_state(afl_state_t * afl)33*08b48e0bSAndroid Build Coastguard Worker char *get_fuzzing_state(afl_state_t *afl) {
34*08b48e0bSAndroid Build Coastguard Worker
35*08b48e0bSAndroid Build Coastguard Worker u64 cur_ms = get_cur_time();
36*08b48e0bSAndroid Build Coastguard Worker u64 last_find = cur_ms - afl->last_find_time;
37*08b48e0bSAndroid Build Coastguard Worker u64 cur_run_time = cur_ms - afl->start_time;
38*08b48e0bSAndroid Build Coastguard Worker u64 cur_total_run_time = afl->prev_run_time + cur_run_time;
39*08b48e0bSAndroid Build Coastguard Worker
40*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->non_instrumented_mode)) {
41*08b48e0bSAndroid Build Coastguard Worker
42*08b48e0bSAndroid Build Coastguard Worker return fuzzing_state[1];
43*08b48e0bSAndroid Build Coastguard Worker
44*08b48e0bSAndroid Build Coastguard Worker } else if (unlikely(cur_run_time < 60 * 3 * 1000 ||
45*08b48e0bSAndroid Build Coastguard Worker
46*08b48e0bSAndroid Build Coastguard Worker cur_total_run_time < 60 * 5 * 1000)) {
47*08b48e0bSAndroid Build Coastguard Worker
48*08b48e0bSAndroid Build Coastguard Worker return fuzzing_state[0];
49*08b48e0bSAndroid Build Coastguard Worker
50*08b48e0bSAndroid Build Coastguard Worker } else {
51*08b48e0bSAndroid Build Coastguard Worker
52*08b48e0bSAndroid Build Coastguard Worker u64 last_find_100 = 100 * last_find;
53*08b48e0bSAndroid Build Coastguard Worker u64 percent_cur = last_find_100 / cur_run_time;
54*08b48e0bSAndroid Build Coastguard Worker u64 percent_total = last_find_100 / cur_total_run_time;
55*08b48e0bSAndroid Build Coastguard Worker
56*08b48e0bSAndroid Build Coastguard Worker if (unlikely(percent_cur >= 80 && percent_total >= 80)) {
57*08b48e0bSAndroid Build Coastguard Worker
58*08b48e0bSAndroid Build Coastguard Worker return fuzzing_state[3];
59*08b48e0bSAndroid Build Coastguard Worker
60*08b48e0bSAndroid Build Coastguard Worker } else if (unlikely(percent_cur >= 55 && percent_total >= 55)) {
61*08b48e0bSAndroid Build Coastguard Worker
62*08b48e0bSAndroid Build Coastguard Worker return fuzzing_state[2];
63*08b48e0bSAndroid Build Coastguard Worker
64*08b48e0bSAndroid Build Coastguard Worker } else {
65*08b48e0bSAndroid Build Coastguard Worker
66*08b48e0bSAndroid Build Coastguard Worker return fuzzing_state[1];
67*08b48e0bSAndroid Build Coastguard Worker
68*08b48e0bSAndroid Build Coastguard Worker }
69*08b48e0bSAndroid Build Coastguard Worker
70*08b48e0bSAndroid Build Coastguard Worker }
71*08b48e0bSAndroid Build Coastguard Worker
72*08b48e0bSAndroid Build Coastguard Worker }
73*08b48e0bSAndroid Build Coastguard Worker
74*08b48e0bSAndroid Build Coastguard Worker /* Write fuzzer setup file */
75*08b48e0bSAndroid Build Coastguard Worker
write_setup_file(afl_state_t * afl,u32 argc,char ** argv)76*08b48e0bSAndroid Build Coastguard Worker void write_setup_file(afl_state_t *afl, u32 argc, char **argv) {
77*08b48e0bSAndroid Build Coastguard Worker
78*08b48e0bSAndroid Build Coastguard Worker u8 fn[PATH_MAX];
79*08b48e0bSAndroid Build Coastguard Worker snprintf(fn, PATH_MAX, "%s/fuzzer_setup", afl->out_dir);
80*08b48e0bSAndroid Build Coastguard Worker FILE *f = create_ffile(fn);
81*08b48e0bSAndroid Build Coastguard Worker u32 i;
82*08b48e0bSAndroid Build Coastguard Worker
83*08b48e0bSAndroid Build Coastguard Worker fprintf(f, "# environment variables:\n");
84*08b48e0bSAndroid Build Coastguard Worker u32 s_afl_env = (u32)sizeof(afl_environment_variables) /
85*08b48e0bSAndroid Build Coastguard Worker sizeof(afl_environment_variables[0]) -
86*08b48e0bSAndroid Build Coastguard Worker 1U;
87*08b48e0bSAndroid Build Coastguard Worker
88*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < s_afl_env; ++i) {
89*08b48e0bSAndroid Build Coastguard Worker
90*08b48e0bSAndroid Build Coastguard Worker char *val;
91*08b48e0bSAndroid Build Coastguard Worker if ((val = getenv(afl_environment_variables[i])) != NULL) {
92*08b48e0bSAndroid Build Coastguard Worker
93*08b48e0bSAndroid Build Coastguard Worker fprintf(f, "%s=%s\n", afl_environment_variables[i], val);
94*08b48e0bSAndroid Build Coastguard Worker
95*08b48e0bSAndroid Build Coastguard Worker }
96*08b48e0bSAndroid Build Coastguard Worker
97*08b48e0bSAndroid Build Coastguard Worker }
98*08b48e0bSAndroid Build Coastguard Worker
99*08b48e0bSAndroid Build Coastguard Worker fprintf(f, "# command line:\n");
100*08b48e0bSAndroid Build Coastguard Worker
101*08b48e0bSAndroid Build Coastguard Worker size_t j;
102*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < argc; ++i) {
103*08b48e0bSAndroid Build Coastguard Worker
104*08b48e0bSAndroid Build Coastguard Worker if (i) fprintf(f, " ");
105*08b48e0bSAndroid Build Coastguard Worker #ifdef __ANDROID__
106*08b48e0bSAndroid Build Coastguard Worker if (memchr(argv[i], '\'', strlen(argv[i]))) {
107*08b48e0bSAndroid Build Coastguard Worker
108*08b48e0bSAndroid Build Coastguard Worker #else
109*08b48e0bSAndroid Build Coastguard Worker if (strchr(argv[i], '\'')) {
110*08b48e0bSAndroid Build Coastguard Worker
111*08b48e0bSAndroid Build Coastguard Worker #endif
112*08b48e0bSAndroid Build Coastguard Worker
113*08b48e0bSAndroid Build Coastguard Worker fprintf(f, "'");
114*08b48e0bSAndroid Build Coastguard Worker for (j = 0; j < strlen(argv[i]); j++)
115*08b48e0bSAndroid Build Coastguard Worker if (argv[i][j] == '\'')
116*08b48e0bSAndroid Build Coastguard Worker fprintf(f, "'\"'\"'");
117*08b48e0bSAndroid Build Coastguard Worker else
118*08b48e0bSAndroid Build Coastguard Worker fprintf(f, "%c", argv[i][j]);
119*08b48e0bSAndroid Build Coastguard Worker fprintf(f, "'");
120*08b48e0bSAndroid Build Coastguard Worker
121*08b48e0bSAndroid Build Coastguard Worker } else {
122*08b48e0bSAndroid Build Coastguard Worker
123*08b48e0bSAndroid Build Coastguard Worker fprintf(f, "'%s'", argv[i]);
124*08b48e0bSAndroid Build Coastguard Worker
125*08b48e0bSAndroid Build Coastguard Worker }
126*08b48e0bSAndroid Build Coastguard Worker
127*08b48e0bSAndroid Build Coastguard Worker }
128*08b48e0bSAndroid Build Coastguard Worker
129*08b48e0bSAndroid Build Coastguard Worker fprintf(f, "\n");
130*08b48e0bSAndroid Build Coastguard Worker
131*08b48e0bSAndroid Build Coastguard Worker fclose(f);
132*08b48e0bSAndroid Build Coastguard Worker (void)(afl_environment_deprecated);
133*08b48e0bSAndroid Build Coastguard Worker
134*08b48e0bSAndroid Build Coastguard Worker }
135*08b48e0bSAndroid Build Coastguard Worker
136*08b48e0bSAndroid Build Coastguard Worker /* load some of the existing stats file when resuming.*/
137*08b48e0bSAndroid Build Coastguard Worker void load_stats_file(afl_state_t *afl) {
138*08b48e0bSAndroid Build Coastguard Worker
139*08b48e0bSAndroid Build Coastguard Worker FILE *f;
140*08b48e0bSAndroid Build Coastguard Worker u8 buf[MAX_LINE];
141*08b48e0bSAndroid Build Coastguard Worker u8 *lptr;
142*08b48e0bSAndroid Build Coastguard Worker u8 fn[PATH_MAX];
143*08b48e0bSAndroid Build Coastguard Worker u32 lineno = 0;
144*08b48e0bSAndroid Build Coastguard Worker snprintf(fn, PATH_MAX, "%s/fuzzer_stats", afl->out_dir);
145*08b48e0bSAndroid Build Coastguard Worker f = fopen(fn, "r");
146*08b48e0bSAndroid Build Coastguard Worker if (!f) {
147*08b48e0bSAndroid Build Coastguard Worker
148*08b48e0bSAndroid Build Coastguard Worker WARNF("Unable to load stats file '%s'", fn);
149*08b48e0bSAndroid Build Coastguard Worker return;
150*08b48e0bSAndroid Build Coastguard Worker
151*08b48e0bSAndroid Build Coastguard Worker }
152*08b48e0bSAndroid Build Coastguard Worker
153*08b48e0bSAndroid Build Coastguard Worker while ((lptr = fgets(buf, MAX_LINE, f))) {
154*08b48e0bSAndroid Build Coastguard Worker
155*08b48e0bSAndroid Build Coastguard Worker lineno++;
156*08b48e0bSAndroid Build Coastguard Worker u8 *lstartptr = lptr;
157*08b48e0bSAndroid Build Coastguard Worker u8 *rptr = lptr + strlen(lptr) - 1;
158*08b48e0bSAndroid Build Coastguard Worker u8 keystring[MAX_LINE];
159*08b48e0bSAndroid Build Coastguard Worker while (*lptr != ':' && lptr < rptr) {
160*08b48e0bSAndroid Build Coastguard Worker
161*08b48e0bSAndroid Build Coastguard Worker lptr++;
162*08b48e0bSAndroid Build Coastguard Worker
163*08b48e0bSAndroid Build Coastguard Worker }
164*08b48e0bSAndroid Build Coastguard Worker
165*08b48e0bSAndroid Build Coastguard Worker if (*lptr == '\n' || !*lptr) {
166*08b48e0bSAndroid Build Coastguard Worker
167*08b48e0bSAndroid Build Coastguard Worker WARNF("Unable to read line %d of stats file", lineno);
168*08b48e0bSAndroid Build Coastguard Worker continue;
169*08b48e0bSAndroid Build Coastguard Worker
170*08b48e0bSAndroid Build Coastguard Worker }
171*08b48e0bSAndroid Build Coastguard Worker
172*08b48e0bSAndroid Build Coastguard Worker if (*lptr == ':') {
173*08b48e0bSAndroid Build Coastguard Worker
174*08b48e0bSAndroid Build Coastguard Worker *lptr = 0;
175*08b48e0bSAndroid Build Coastguard Worker strcpy(keystring, lstartptr);
176*08b48e0bSAndroid Build Coastguard Worker lptr++;
177*08b48e0bSAndroid Build Coastguard Worker char *nptr;
178*08b48e0bSAndroid Build Coastguard Worker switch (lineno) {
179*08b48e0bSAndroid Build Coastguard Worker
180*08b48e0bSAndroid Build Coastguard Worker case 3:
181*08b48e0bSAndroid Build Coastguard Worker if (!strcmp(keystring, "run_time "))
182*08b48e0bSAndroid Build Coastguard Worker afl->prev_run_time = 1000 * strtoull(lptr, &nptr, 10);
183*08b48e0bSAndroid Build Coastguard Worker break;
184*08b48e0bSAndroid Build Coastguard Worker case 5:
185*08b48e0bSAndroid Build Coastguard Worker if (!strcmp(keystring, "cycles_done "))
186*08b48e0bSAndroid Build Coastguard Worker afl->queue_cycle =
187*08b48e0bSAndroid Build Coastguard Worker strtoull(lptr, &nptr, 10) ? strtoull(lptr, &nptr, 10) + 1 : 0;
188*08b48e0bSAndroid Build Coastguard Worker break;
189*08b48e0bSAndroid Build Coastguard Worker case 7:
190*08b48e0bSAndroid Build Coastguard Worker if (!strcmp(keystring, "execs_done "))
191*08b48e0bSAndroid Build Coastguard Worker afl->fsrv.total_execs = strtoull(lptr, &nptr, 10);
192*08b48e0bSAndroid Build Coastguard Worker break;
193*08b48e0bSAndroid Build Coastguard Worker case 10:
194*08b48e0bSAndroid Build Coastguard Worker if (!strcmp(keystring, "corpus_count ")) {
195*08b48e0bSAndroid Build Coastguard Worker
196*08b48e0bSAndroid Build Coastguard Worker u32 corpus_count = strtoul(lptr, &nptr, 10);
197*08b48e0bSAndroid Build Coastguard Worker if (corpus_count != afl->queued_items) {
198*08b48e0bSAndroid Build Coastguard Worker
199*08b48e0bSAndroid Build Coastguard Worker WARNF(
200*08b48e0bSAndroid Build Coastguard Worker "queue/ has been modified -- things might not work, you're "
201*08b48e0bSAndroid Build Coastguard Worker "on your own!");
202*08b48e0bSAndroid Build Coastguard Worker
203*08b48e0bSAndroid Build Coastguard Worker }
204*08b48e0bSAndroid Build Coastguard Worker
205*08b48e0bSAndroid Build Coastguard Worker }
206*08b48e0bSAndroid Build Coastguard Worker
207*08b48e0bSAndroid Build Coastguard Worker break;
208*08b48e0bSAndroid Build Coastguard Worker case 12:
209*08b48e0bSAndroid Build Coastguard Worker if (!strcmp(keystring, "corpus_found "))
210*08b48e0bSAndroid Build Coastguard Worker afl->queued_discovered = strtoul(lptr, &nptr, 10);
211*08b48e0bSAndroid Build Coastguard Worker break;
212*08b48e0bSAndroid Build Coastguard Worker case 13:
213*08b48e0bSAndroid Build Coastguard Worker if (!strcmp(keystring, "corpus_imported "))
214*08b48e0bSAndroid Build Coastguard Worker afl->queued_imported = strtoul(lptr, &nptr, 10);
215*08b48e0bSAndroid Build Coastguard Worker break;
216*08b48e0bSAndroid Build Coastguard Worker case 14:
217*08b48e0bSAndroid Build Coastguard Worker if (!strcmp(keystring, "max_depth "))
218*08b48e0bSAndroid Build Coastguard Worker afl->max_depth = strtoul(lptr, &nptr, 10);
219*08b48e0bSAndroid Build Coastguard Worker break;
220*08b48e0bSAndroid Build Coastguard Worker case 21:
221*08b48e0bSAndroid Build Coastguard Worker if (!strcmp(keystring, "saved_crashes "))
222*08b48e0bSAndroid Build Coastguard Worker afl->saved_crashes = strtoull(lptr, &nptr, 10);
223*08b48e0bSAndroid Build Coastguard Worker break;
224*08b48e0bSAndroid Build Coastguard Worker case 22:
225*08b48e0bSAndroid Build Coastguard Worker if (!strcmp(keystring, "saved_hangs "))
226*08b48e0bSAndroid Build Coastguard Worker afl->saved_hangs = strtoull(lptr, &nptr, 10);
227*08b48e0bSAndroid Build Coastguard Worker break;
228*08b48e0bSAndroid Build Coastguard Worker default:
229*08b48e0bSAndroid Build Coastguard Worker break;
230*08b48e0bSAndroid Build Coastguard Worker
231*08b48e0bSAndroid Build Coastguard Worker }
232*08b48e0bSAndroid Build Coastguard Worker
233*08b48e0bSAndroid Build Coastguard Worker }
234*08b48e0bSAndroid Build Coastguard Worker
235*08b48e0bSAndroid Build Coastguard Worker }
236*08b48e0bSAndroid Build Coastguard Worker
237*08b48e0bSAndroid Build Coastguard Worker if (afl->saved_crashes) { write_crash_readme(afl); }
238*08b48e0bSAndroid Build Coastguard Worker
239*08b48e0bSAndroid Build Coastguard Worker return;
240*08b48e0bSAndroid Build Coastguard Worker
241*08b48e0bSAndroid Build Coastguard Worker }
242*08b48e0bSAndroid Build Coastguard Worker
243*08b48e0bSAndroid Build Coastguard Worker /* Update stats file for unattended monitoring. */
244*08b48e0bSAndroid Build Coastguard Worker
245*08b48e0bSAndroid Build Coastguard Worker void write_stats_file(afl_state_t *afl, u32 t_bytes, double bitmap_cvg,
246*08b48e0bSAndroid Build Coastguard Worker double stability, double eps) {
247*08b48e0bSAndroid Build Coastguard Worker
248*08b48e0bSAndroid Build Coastguard Worker #ifndef __HAIKU__
249*08b48e0bSAndroid Build Coastguard Worker struct rusage rus;
250*08b48e0bSAndroid Build Coastguard Worker #endif
251*08b48e0bSAndroid Build Coastguard Worker
252*08b48e0bSAndroid Build Coastguard Worker u64 cur_time = get_cur_time();
253*08b48e0bSAndroid Build Coastguard Worker u8 fn_tmp[PATH_MAX];
254*08b48e0bSAndroid Build Coastguard Worker u8 fn_final[PATH_MAX];
255*08b48e0bSAndroid Build Coastguard Worker FILE *f;
256*08b48e0bSAndroid Build Coastguard Worker
257*08b48e0bSAndroid Build Coastguard Worker snprintf(fn_tmp, PATH_MAX, "%s/.fuzzer_stats_tmp", afl->out_dir);
258*08b48e0bSAndroid Build Coastguard Worker snprintf(fn_final, PATH_MAX, "%s/fuzzer_stats", afl->out_dir);
259*08b48e0bSAndroid Build Coastguard Worker f = create_ffile(fn_tmp);
260*08b48e0bSAndroid Build Coastguard Worker
261*08b48e0bSAndroid Build Coastguard Worker /* Keep last values in case we're called from another context
262*08b48e0bSAndroid Build Coastguard Worker where exec/sec stats and such are not readily available. */
263*08b48e0bSAndroid Build Coastguard Worker
264*08b48e0bSAndroid Build Coastguard Worker if (!bitmap_cvg && !stability && !eps) {
265*08b48e0bSAndroid Build Coastguard Worker
266*08b48e0bSAndroid Build Coastguard Worker bitmap_cvg = afl->last_bitmap_cvg;
267*08b48e0bSAndroid Build Coastguard Worker stability = afl->last_stability;
268*08b48e0bSAndroid Build Coastguard Worker
269*08b48e0bSAndroid Build Coastguard Worker } else {
270*08b48e0bSAndroid Build Coastguard Worker
271*08b48e0bSAndroid Build Coastguard Worker afl->last_bitmap_cvg = bitmap_cvg;
272*08b48e0bSAndroid Build Coastguard Worker afl->last_stability = stability;
273*08b48e0bSAndroid Build Coastguard Worker afl->last_eps = eps;
274*08b48e0bSAndroid Build Coastguard Worker
275*08b48e0bSAndroid Build Coastguard Worker }
276*08b48e0bSAndroid Build Coastguard Worker
277*08b48e0bSAndroid Build Coastguard Worker if ((unlikely(!afl->last_avg_exec_update ||
278*08b48e0bSAndroid Build Coastguard Worker cur_time - afl->last_avg_exec_update >= 60000))) {
279*08b48e0bSAndroid Build Coastguard Worker
280*08b48e0bSAndroid Build Coastguard Worker afl->last_avg_execs_saved =
281*08b48e0bSAndroid Build Coastguard Worker (double)(1000 * (afl->fsrv.total_execs - afl->last_avg_execs)) /
282*08b48e0bSAndroid Build Coastguard Worker (double)(cur_time - afl->last_avg_exec_update);
283*08b48e0bSAndroid Build Coastguard Worker afl->last_avg_execs = afl->fsrv.total_execs;
284*08b48e0bSAndroid Build Coastguard Worker afl->last_avg_exec_update = cur_time;
285*08b48e0bSAndroid Build Coastguard Worker
286*08b48e0bSAndroid Build Coastguard Worker }
287*08b48e0bSAndroid Build Coastguard Worker
288*08b48e0bSAndroid Build Coastguard Worker #ifndef __HAIKU__
289*08b48e0bSAndroid Build Coastguard Worker if (getrusage(RUSAGE_CHILDREN, &rus)) { rus.ru_maxrss = 0; }
290*08b48e0bSAndroid Build Coastguard Worker #endif
291*08b48e0bSAndroid Build Coastguard Worker u64 runtime = afl->prev_run_time + cur_time - afl->start_time;
292*08b48e0bSAndroid Build Coastguard Worker if (!runtime) { runtime = 1; }
293*08b48e0bSAndroid Build Coastguard Worker
294*08b48e0bSAndroid Build Coastguard Worker fprintf(
295*08b48e0bSAndroid Build Coastguard Worker f,
296*08b48e0bSAndroid Build Coastguard Worker "start_time : %llu\n"
297*08b48e0bSAndroid Build Coastguard Worker "last_update : %llu\n"
298*08b48e0bSAndroid Build Coastguard Worker "run_time : %llu\n"
299*08b48e0bSAndroid Build Coastguard Worker "fuzzer_pid : %u\n"
300*08b48e0bSAndroid Build Coastguard Worker "cycles_done : %llu\n"
301*08b48e0bSAndroid Build Coastguard Worker "cycles_wo_finds : %llu\n"
302*08b48e0bSAndroid Build Coastguard Worker "time_wo_finds : %llu\n"
303*08b48e0bSAndroid Build Coastguard Worker "execs_done : %llu\n"
304*08b48e0bSAndroid Build Coastguard Worker "execs_per_sec : %0.02f\n"
305*08b48e0bSAndroid Build Coastguard Worker "execs_ps_last_min : %0.02f\n"
306*08b48e0bSAndroid Build Coastguard Worker "corpus_count : %u\n"
307*08b48e0bSAndroid Build Coastguard Worker "corpus_favored : %u\n"
308*08b48e0bSAndroid Build Coastguard Worker "corpus_found : %u\n"
309*08b48e0bSAndroid Build Coastguard Worker "corpus_imported : %u\n"
310*08b48e0bSAndroid Build Coastguard Worker "corpus_variable : %u\n"
311*08b48e0bSAndroid Build Coastguard Worker "max_depth : %u\n"
312*08b48e0bSAndroid Build Coastguard Worker "cur_item : %u\n"
313*08b48e0bSAndroid Build Coastguard Worker "pending_favs : %u\n"
314*08b48e0bSAndroid Build Coastguard Worker "pending_total : %u\n"
315*08b48e0bSAndroid Build Coastguard Worker "stability : %0.02f%%\n"
316*08b48e0bSAndroid Build Coastguard Worker "bitmap_cvg : %0.02f%%\n"
317*08b48e0bSAndroid Build Coastguard Worker "saved_crashes : %llu\n"
318*08b48e0bSAndroid Build Coastguard Worker "saved_hangs : %llu\n"
319*08b48e0bSAndroid Build Coastguard Worker "last_find : %llu\n"
320*08b48e0bSAndroid Build Coastguard Worker "last_crash : %llu\n"
321*08b48e0bSAndroid Build Coastguard Worker "last_hang : %llu\n"
322*08b48e0bSAndroid Build Coastguard Worker "execs_since_crash : %llu\n"
323*08b48e0bSAndroid Build Coastguard Worker "exec_timeout : %u\n"
324*08b48e0bSAndroid Build Coastguard Worker "slowest_exec_ms : %u\n"
325*08b48e0bSAndroid Build Coastguard Worker "peak_rss_mb : %lu\n"
326*08b48e0bSAndroid Build Coastguard Worker "cpu_affinity : %d\n"
327*08b48e0bSAndroid Build Coastguard Worker "edges_found : %u\n"
328*08b48e0bSAndroid Build Coastguard Worker "total_edges : %u\n"
329*08b48e0bSAndroid Build Coastguard Worker "var_byte_count : %u\n"
330*08b48e0bSAndroid Build Coastguard Worker "havoc_expansion : %u\n"
331*08b48e0bSAndroid Build Coastguard Worker "auto_dict_entries : %u\n"
332*08b48e0bSAndroid Build Coastguard Worker "testcache_size : %llu\n"
333*08b48e0bSAndroid Build Coastguard Worker "testcache_count : %u\n"
334*08b48e0bSAndroid Build Coastguard Worker "testcache_evict : %u\n"
335*08b48e0bSAndroid Build Coastguard Worker "afl_banner : %s\n"
336*08b48e0bSAndroid Build Coastguard Worker "afl_version : " VERSION
337*08b48e0bSAndroid Build Coastguard Worker "\n"
338*08b48e0bSAndroid Build Coastguard Worker "target_mode : %s%s%s%s%s%s%s%s%s%s\n"
339*08b48e0bSAndroid Build Coastguard Worker "command_line : %s\n",
340*08b48e0bSAndroid Build Coastguard Worker (afl->start_time - afl->prev_run_time) / 1000, cur_time / 1000,
341*08b48e0bSAndroid Build Coastguard Worker runtime / 1000, (u32)getpid(),
342*08b48e0bSAndroid Build Coastguard Worker afl->queue_cycle ? (afl->queue_cycle - 1) : 0, afl->cycles_wo_finds,
343*08b48e0bSAndroid Build Coastguard Worker afl->longest_find_time > cur_time - afl->last_find_time
344*08b48e0bSAndroid Build Coastguard Worker ? afl->longest_find_time / 1000
345*08b48e0bSAndroid Build Coastguard Worker : ((afl->start_time == 0 || afl->last_find_time == 0)
346*08b48e0bSAndroid Build Coastguard Worker ? 0
347*08b48e0bSAndroid Build Coastguard Worker : (cur_time - afl->last_find_time) / 1000),
348*08b48e0bSAndroid Build Coastguard Worker afl->fsrv.total_execs, afl->fsrv.total_execs / ((double)(runtime) / 1000),
349*08b48e0bSAndroid Build Coastguard Worker afl->last_avg_execs_saved, afl->queued_items, afl->queued_favored,
350*08b48e0bSAndroid Build Coastguard Worker afl->queued_discovered, afl->queued_imported, afl->queued_variable,
351*08b48e0bSAndroid Build Coastguard Worker afl->max_depth, afl->current_entry, afl->pending_favored,
352*08b48e0bSAndroid Build Coastguard Worker afl->pending_not_fuzzed, stability, bitmap_cvg, afl->saved_crashes,
353*08b48e0bSAndroid Build Coastguard Worker afl->saved_hangs, afl->last_find_time / 1000, afl->last_crash_time / 1000,
354*08b48e0bSAndroid Build Coastguard Worker afl->last_hang_time / 1000, afl->fsrv.total_execs - afl->last_crash_execs,
355*08b48e0bSAndroid Build Coastguard Worker afl->fsrv.exec_tmout, afl->slowest_exec_ms,
356*08b48e0bSAndroid Build Coastguard Worker #ifndef __HAIKU__
357*08b48e0bSAndroid Build Coastguard Worker #ifdef __APPLE__
358*08b48e0bSAndroid Build Coastguard Worker (unsigned long int)(rus.ru_maxrss >> 20),
359*08b48e0bSAndroid Build Coastguard Worker #else
360*08b48e0bSAndroid Build Coastguard Worker (unsigned long int)(rus.ru_maxrss >> 10),
361*08b48e0bSAndroid Build Coastguard Worker #endif
362*08b48e0bSAndroid Build Coastguard Worker #else
363*08b48e0bSAndroid Build Coastguard Worker -1UL,
364*08b48e0bSAndroid Build Coastguard Worker #endif
365*08b48e0bSAndroid Build Coastguard Worker #ifdef HAVE_AFFINITY
366*08b48e0bSAndroid Build Coastguard Worker afl->cpu_aff,
367*08b48e0bSAndroid Build Coastguard Worker #else
368*08b48e0bSAndroid Build Coastguard Worker -1,
369*08b48e0bSAndroid Build Coastguard Worker #endif
370*08b48e0bSAndroid Build Coastguard Worker t_bytes, afl->fsrv.real_map_size, afl->var_byte_count, afl->expand_havoc,
371*08b48e0bSAndroid Build Coastguard Worker afl->a_extras_cnt, afl->q_testcase_cache_size,
372*08b48e0bSAndroid Build Coastguard Worker afl->q_testcase_cache_count, afl->q_testcase_evictions, afl->use_banner,
373*08b48e0bSAndroid Build Coastguard Worker afl->unicorn_mode ? "unicorn" : "", afl->fsrv.qemu_mode ? "qemu " : "",
374*08b48e0bSAndroid Build Coastguard Worker afl->fsrv.cs_mode ? "coresight" : "",
375*08b48e0bSAndroid Build Coastguard Worker afl->non_instrumented_mode ? " non_instrumented " : "",
376*08b48e0bSAndroid Build Coastguard Worker afl->no_forkserver ? "no_fsrv " : "", afl->crash_mode ? "crash " : "",
377*08b48e0bSAndroid Build Coastguard Worker afl->persistent_mode ? "persistent " : "",
378*08b48e0bSAndroid Build Coastguard Worker afl->shmem_testcase_mode ? "shmem_testcase " : "",
379*08b48e0bSAndroid Build Coastguard Worker afl->deferred_mode ? "deferred " : "",
380*08b48e0bSAndroid Build Coastguard Worker (afl->unicorn_mode || afl->fsrv.qemu_mode || afl->fsrv.cs_mode ||
381*08b48e0bSAndroid Build Coastguard Worker afl->non_instrumented_mode || afl->no_forkserver || afl->crash_mode ||
382*08b48e0bSAndroid Build Coastguard Worker afl->persistent_mode || afl->deferred_mode)
383*08b48e0bSAndroid Build Coastguard Worker ? ""
384*08b48e0bSAndroid Build Coastguard Worker : "default",
385*08b48e0bSAndroid Build Coastguard Worker afl->orig_cmdline);
386*08b48e0bSAndroid Build Coastguard Worker
387*08b48e0bSAndroid Build Coastguard Worker /* ignore errors */
388*08b48e0bSAndroid Build Coastguard Worker
389*08b48e0bSAndroid Build Coastguard Worker if (afl->debug) {
390*08b48e0bSAndroid Build Coastguard Worker
391*08b48e0bSAndroid Build Coastguard Worker u32 i = 0;
392*08b48e0bSAndroid Build Coastguard Worker fprintf(f, "virgin_bytes :");
393*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < afl->fsrv.real_map_size; i++) {
394*08b48e0bSAndroid Build Coastguard Worker
395*08b48e0bSAndroid Build Coastguard Worker if (afl->virgin_bits[i] != 0xff) {
396*08b48e0bSAndroid Build Coastguard Worker
397*08b48e0bSAndroid Build Coastguard Worker fprintf(f, " %u[%02x]", i, afl->virgin_bits[i]);
398*08b48e0bSAndroid Build Coastguard Worker
399*08b48e0bSAndroid Build Coastguard Worker }
400*08b48e0bSAndroid Build Coastguard Worker
401*08b48e0bSAndroid Build Coastguard Worker }
402*08b48e0bSAndroid Build Coastguard Worker
403*08b48e0bSAndroid Build Coastguard Worker fprintf(f, "\n");
404*08b48e0bSAndroid Build Coastguard Worker fprintf(f, "var_bytes :");
405*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < afl->fsrv.real_map_size; i++) {
406*08b48e0bSAndroid Build Coastguard Worker
407*08b48e0bSAndroid Build Coastguard Worker if (afl->var_bytes[i]) { fprintf(f, " %u", i); }
408*08b48e0bSAndroid Build Coastguard Worker
409*08b48e0bSAndroid Build Coastguard Worker }
410*08b48e0bSAndroid Build Coastguard Worker
411*08b48e0bSAndroid Build Coastguard Worker fprintf(f, "\n");
412*08b48e0bSAndroid Build Coastguard Worker
413*08b48e0bSAndroid Build Coastguard Worker }
414*08b48e0bSAndroid Build Coastguard Worker
415*08b48e0bSAndroid Build Coastguard Worker fclose(f);
416*08b48e0bSAndroid Build Coastguard Worker rename(fn_tmp, fn_final);
417*08b48e0bSAndroid Build Coastguard Worker
418*08b48e0bSAndroid Build Coastguard Worker }
419*08b48e0bSAndroid Build Coastguard Worker
420*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
421*08b48e0bSAndroid Build Coastguard Worker void write_queue_stats(afl_state_t *afl) {
422*08b48e0bSAndroid Build Coastguard Worker
423*08b48e0bSAndroid Build Coastguard Worker FILE *f;
424*08b48e0bSAndroid Build Coastguard Worker u8 *fn = alloc_printf("%s/queue_data", afl->out_dir);
425*08b48e0bSAndroid Build Coastguard Worker if ((f = fopen(fn, "w")) != NULL) {
426*08b48e0bSAndroid Build Coastguard Worker
427*08b48e0bSAndroid Build Coastguard Worker u32 id;
428*08b48e0bSAndroid Build Coastguard Worker fprintf(f,
429*08b48e0bSAndroid Build Coastguard Worker "# filename, length, exec_us, selected, skipped, mutations, finds, "
430*08b48e0bSAndroid Build Coastguard Worker "crashes, timeouts, bitmap_size, perf_score, weight, colorized, "
431*08b48e0bSAndroid Build Coastguard Worker "favored, disabled\n");
432*08b48e0bSAndroid Build Coastguard Worker for (id = 0; id < afl->queued_items; ++id) {
433*08b48e0bSAndroid Build Coastguard Worker
434*08b48e0bSAndroid Build Coastguard Worker struct queue_entry *q = afl->queue_buf[id];
435*08b48e0bSAndroid Build Coastguard Worker fprintf(f, "\"%s\",%u,%llu,%u,%u,%llu,%u,%u,%u,%u,%.3f,%.3f,%u,%u,%u\n",
436*08b48e0bSAndroid Build Coastguard Worker q->fname, q->len, q->exec_us, q->stats_selected, q->stats_skipped,
437*08b48e0bSAndroid Build Coastguard Worker q->stats_mutated, q->stats_finds, q->stats_crashes,
438*08b48e0bSAndroid Build Coastguard Worker q->stats_tmouts, q->bitmap_size, q->perf_score, q->weight,
439*08b48e0bSAndroid Build Coastguard Worker q->colorized, q->favored, q->disabled);
440*08b48e0bSAndroid Build Coastguard Worker
441*08b48e0bSAndroid Build Coastguard Worker }
442*08b48e0bSAndroid Build Coastguard Worker
443*08b48e0bSAndroid Build Coastguard Worker fclose(f);
444*08b48e0bSAndroid Build Coastguard Worker
445*08b48e0bSAndroid Build Coastguard Worker }
446*08b48e0bSAndroid Build Coastguard Worker
447*08b48e0bSAndroid Build Coastguard Worker ck_free(fn);
448*08b48e0bSAndroid Build Coastguard Worker
449*08b48e0bSAndroid Build Coastguard Worker }
450*08b48e0bSAndroid Build Coastguard Worker
451*08b48e0bSAndroid Build Coastguard Worker #endif
452*08b48e0bSAndroid Build Coastguard Worker
453*08b48e0bSAndroid Build Coastguard Worker /* Update the plot file if there is a reason to. */
454*08b48e0bSAndroid Build Coastguard Worker
455*08b48e0bSAndroid Build Coastguard Worker void maybe_update_plot_file(afl_state_t *afl, u32 t_bytes, double bitmap_cvg,
456*08b48e0bSAndroid Build Coastguard Worker double eps) {
457*08b48e0bSAndroid Build Coastguard Worker
458*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!afl->force_ui_update &&
459*08b48e0bSAndroid Build Coastguard Worker (afl->stop_soon ||
460*08b48e0bSAndroid Build Coastguard Worker (afl->plot_prev_qp == afl->queued_items &&
461*08b48e0bSAndroid Build Coastguard Worker afl->plot_prev_pf == afl->pending_favored &&
462*08b48e0bSAndroid Build Coastguard Worker afl->plot_prev_pnf == afl->pending_not_fuzzed &&
463*08b48e0bSAndroid Build Coastguard Worker afl->plot_prev_ce == afl->current_entry &&
464*08b48e0bSAndroid Build Coastguard Worker afl->plot_prev_qc == afl->queue_cycle &&
465*08b48e0bSAndroid Build Coastguard Worker afl->plot_prev_uc == afl->saved_crashes &&
466*08b48e0bSAndroid Build Coastguard Worker afl->plot_prev_uh == afl->saved_hangs &&
467*08b48e0bSAndroid Build Coastguard Worker afl->plot_prev_md == afl->max_depth &&
468*08b48e0bSAndroid Build Coastguard Worker afl->plot_prev_ed == afl->fsrv.total_execs) ||
469*08b48e0bSAndroid Build Coastguard Worker !afl->queue_cycle ||
470*08b48e0bSAndroid Build Coastguard Worker get_cur_time() - afl->start_time <= 60000))) {
471*08b48e0bSAndroid Build Coastguard Worker
472*08b48e0bSAndroid Build Coastguard Worker return;
473*08b48e0bSAndroid Build Coastguard Worker
474*08b48e0bSAndroid Build Coastguard Worker }
475*08b48e0bSAndroid Build Coastguard Worker
476*08b48e0bSAndroid Build Coastguard Worker afl->plot_prev_qp = afl->queued_items;
477*08b48e0bSAndroid Build Coastguard Worker afl->plot_prev_pf = afl->pending_favored;
478*08b48e0bSAndroid Build Coastguard Worker afl->plot_prev_pnf = afl->pending_not_fuzzed;
479*08b48e0bSAndroid Build Coastguard Worker afl->plot_prev_ce = afl->current_entry;
480*08b48e0bSAndroid Build Coastguard Worker afl->plot_prev_qc = afl->queue_cycle;
481*08b48e0bSAndroid Build Coastguard Worker afl->plot_prev_uc = afl->saved_crashes;
482*08b48e0bSAndroid Build Coastguard Worker afl->plot_prev_uh = afl->saved_hangs;
483*08b48e0bSAndroid Build Coastguard Worker afl->plot_prev_md = afl->max_depth;
484*08b48e0bSAndroid Build Coastguard Worker afl->plot_prev_ed = afl->fsrv.total_execs;
485*08b48e0bSAndroid Build Coastguard Worker
486*08b48e0bSAndroid Build Coastguard Worker /* Fields in the file:
487*08b48e0bSAndroid Build Coastguard Worker
488*08b48e0bSAndroid Build Coastguard Worker relative_time, afl->cycles_done, cur_item, corpus_count, corpus_not_fuzzed,
489*08b48e0bSAndroid Build Coastguard Worker favored_not_fuzzed, saved_crashes, saved_hangs, max_depth,
490*08b48e0bSAndroid Build Coastguard Worker execs_per_sec, edges_found */
491*08b48e0bSAndroid Build Coastguard Worker
492*08b48e0bSAndroid Build Coastguard Worker fprintf(afl->fsrv.plot_file,
493*08b48e0bSAndroid Build Coastguard Worker "%llu, %llu, %u, %u, %u, %u, %0.02f%%, %llu, %llu, %u, %0.02f, %llu, "
494*08b48e0bSAndroid Build Coastguard Worker "%u\n",
495*08b48e0bSAndroid Build Coastguard Worker ((afl->prev_run_time + get_cur_time() - afl->start_time) / 1000),
496*08b48e0bSAndroid Build Coastguard Worker afl->queue_cycle - 1, afl->current_entry, afl->queued_items,
497*08b48e0bSAndroid Build Coastguard Worker afl->pending_not_fuzzed, afl->pending_favored, bitmap_cvg,
498*08b48e0bSAndroid Build Coastguard Worker afl->saved_crashes, afl->saved_hangs, afl->max_depth, eps,
499*08b48e0bSAndroid Build Coastguard Worker afl->plot_prev_ed, t_bytes); /* ignore errors */
500*08b48e0bSAndroid Build Coastguard Worker
501*08b48e0bSAndroid Build Coastguard Worker fflush(afl->fsrv.plot_file);
502*08b48e0bSAndroid Build Coastguard Worker
503*08b48e0bSAndroid Build Coastguard Worker }
504*08b48e0bSAndroid Build Coastguard Worker
505*08b48e0bSAndroid Build Coastguard Worker /* Log deterministic stage efficiency */
506*08b48e0bSAndroid Build Coastguard Worker
507*08b48e0bSAndroid Build Coastguard Worker void plot_profile_data(afl_state_t *afl, struct queue_entry *q) {
508*08b48e0bSAndroid Build Coastguard Worker
509*08b48e0bSAndroid Build Coastguard Worker u64 current_ms = get_cur_time() - afl->start_time;
510*08b48e0bSAndroid Build Coastguard Worker
511*08b48e0bSAndroid Build Coastguard Worker u32 current_edges = count_non_255_bytes(afl, afl->virgin_bits);
512*08b48e0bSAndroid Build Coastguard Worker double det_finding_rate = (double)afl->havoc_prof->total_det_edge * 100.0 /
513*08b48e0bSAndroid Build Coastguard Worker (double)current_edges,
514*08b48e0bSAndroid Build Coastguard Worker det_time_rate = (double)afl->havoc_prof->total_det_time * 100.0 /
515*08b48e0bSAndroid Build Coastguard Worker (double)current_ms;
516*08b48e0bSAndroid Build Coastguard Worker
517*08b48e0bSAndroid Build Coastguard Worker u32 ndet_bits = 0;
518*08b48e0bSAndroid Build Coastguard Worker for (u32 i = 0; i < afl->fsrv.map_size; i++) {
519*08b48e0bSAndroid Build Coastguard Worker
520*08b48e0bSAndroid Build Coastguard Worker if (afl->skipdet_g->virgin_det_bits[i]) ndet_bits += 1;
521*08b48e0bSAndroid Build Coastguard Worker
522*08b48e0bSAndroid Build Coastguard Worker }
523*08b48e0bSAndroid Build Coastguard Worker
524*08b48e0bSAndroid Build Coastguard Worker double det_fuzzed_rate = (double)ndet_bits * 100.0 / (double)current_edges;
525*08b48e0bSAndroid Build Coastguard Worker
526*08b48e0bSAndroid Build Coastguard Worker fprintf(afl->fsrv.det_plot_file,
527*08b48e0bSAndroid Build Coastguard Worker "[%02lld:%02lld:%02lld] fuzz %d (%d), find %d/%d among %d(%02.2f) "
528*08b48e0bSAndroid Build Coastguard Worker "and spend %lld/%lld(%02.2f), cover %02.2f yet, %d/%d undet bits, "
529*08b48e0bSAndroid Build Coastguard Worker "continue %d.\n",
530*08b48e0bSAndroid Build Coastguard Worker current_ms / 1000 / 3600, (current_ms / 1000 / 60) % 60,
531*08b48e0bSAndroid Build Coastguard Worker (current_ms / 1000) % 60, afl->current_entry, q->fuzz_level,
532*08b48e0bSAndroid Build Coastguard Worker afl->havoc_prof->edge_det_stage, afl->havoc_prof->edge_havoc_stage,
533*08b48e0bSAndroid Build Coastguard Worker current_edges, det_finding_rate,
534*08b48e0bSAndroid Build Coastguard Worker afl->havoc_prof->det_stage_time / 1000,
535*08b48e0bSAndroid Build Coastguard Worker afl->havoc_prof->havoc_stage_time / 1000, det_time_rate,
536*08b48e0bSAndroid Build Coastguard Worker det_fuzzed_rate, q->skipdet_e->undet_bits,
537*08b48e0bSAndroid Build Coastguard Worker afl->skipdet_g->undet_bits_threshold, q->skipdet_e->continue_inf);
538*08b48e0bSAndroid Build Coastguard Worker
539*08b48e0bSAndroid Build Coastguard Worker fflush(afl->fsrv.det_plot_file);
540*08b48e0bSAndroid Build Coastguard Worker
541*08b48e0bSAndroid Build Coastguard Worker }
542*08b48e0bSAndroid Build Coastguard Worker
543*08b48e0bSAndroid Build Coastguard Worker /* Check terminal dimensions after resize. */
544*08b48e0bSAndroid Build Coastguard Worker
545*08b48e0bSAndroid Build Coastguard Worker static void check_term_size(afl_state_t *afl) {
546*08b48e0bSAndroid Build Coastguard Worker
547*08b48e0bSAndroid Build Coastguard Worker struct winsize ws;
548*08b48e0bSAndroid Build Coastguard Worker
549*08b48e0bSAndroid Build Coastguard Worker afl->term_too_small = 0;
550*08b48e0bSAndroid Build Coastguard Worker
551*08b48e0bSAndroid Build Coastguard Worker if (ioctl(1, TIOCGWINSZ, &ws)) { return; }
552*08b48e0bSAndroid Build Coastguard Worker
553*08b48e0bSAndroid Build Coastguard Worker if (ws.ws_row == 0 || ws.ws_col == 0) { return; }
554*08b48e0bSAndroid Build Coastguard Worker if (ws.ws_row < 24 || ws.ws_col < 79) { afl->term_too_small = 1; }
555*08b48e0bSAndroid Build Coastguard Worker
556*08b48e0bSAndroid Build Coastguard Worker }
557*08b48e0bSAndroid Build Coastguard Worker
558*08b48e0bSAndroid Build Coastguard Worker /* A spiffy retro stats screen! This is called every afl->stats_update_freq
559*08b48e0bSAndroid Build Coastguard Worker execve() calls, plus in several other circumstances. */
560*08b48e0bSAndroid Build Coastguard Worker
561*08b48e0bSAndroid Build Coastguard Worker void show_stats(afl_state_t *afl) {
562*08b48e0bSAndroid Build Coastguard Worker
563*08b48e0bSAndroid Build Coastguard Worker if (afl->pizza_is_served) {
564*08b48e0bSAndroid Build Coastguard Worker
565*08b48e0bSAndroid Build Coastguard Worker show_stats_pizza(afl);
566*08b48e0bSAndroid Build Coastguard Worker
567*08b48e0bSAndroid Build Coastguard Worker } else {
568*08b48e0bSAndroid Build Coastguard Worker
569*08b48e0bSAndroid Build Coastguard Worker show_stats_normal(afl);
570*08b48e0bSAndroid Build Coastguard Worker
571*08b48e0bSAndroid Build Coastguard Worker }
572*08b48e0bSAndroid Build Coastguard Worker
573*08b48e0bSAndroid Build Coastguard Worker }
574*08b48e0bSAndroid Build Coastguard Worker
575*08b48e0bSAndroid Build Coastguard Worker void show_stats_normal(afl_state_t *afl) {
576*08b48e0bSAndroid Build Coastguard Worker
577*08b48e0bSAndroid Build Coastguard Worker double t_byte_ratio, stab_ratio;
578*08b48e0bSAndroid Build Coastguard Worker
579*08b48e0bSAndroid Build Coastguard Worker u64 cur_ms;
580*08b48e0bSAndroid Build Coastguard Worker u32 t_bytes, t_bits;
581*08b48e0bSAndroid Build Coastguard Worker
582*08b48e0bSAndroid Build Coastguard Worker static u8 banner[128];
583*08b48e0bSAndroid Build Coastguard Worker u32 banner_len, banner_pad;
584*08b48e0bSAndroid Build Coastguard Worker u8 tmp[256];
585*08b48e0bSAndroid Build Coastguard Worker u8 time_tmp[64];
586*08b48e0bSAndroid Build Coastguard Worker
587*08b48e0bSAndroid Build Coastguard Worker u8 val_buf[8][STRINGIFY_VAL_SIZE_MAX];
588*08b48e0bSAndroid Build Coastguard Worker #define IB(i) (val_buf[(i)])
589*08b48e0bSAndroid Build Coastguard Worker
590*08b48e0bSAndroid Build Coastguard Worker cur_ms = get_cur_time();
591*08b48e0bSAndroid Build Coastguard Worker
592*08b48e0bSAndroid Build Coastguard Worker if (afl->most_time_key) {
593*08b48e0bSAndroid Build Coastguard Worker
594*08b48e0bSAndroid Build Coastguard Worker if (afl->most_time * 1000 < cur_ms - afl->start_time) {
595*08b48e0bSAndroid Build Coastguard Worker
596*08b48e0bSAndroid Build Coastguard Worker afl->most_time_key = 2;
597*08b48e0bSAndroid Build Coastguard Worker afl->stop_soon = 2;
598*08b48e0bSAndroid Build Coastguard Worker
599*08b48e0bSAndroid Build Coastguard Worker }
600*08b48e0bSAndroid Build Coastguard Worker
601*08b48e0bSAndroid Build Coastguard Worker }
602*08b48e0bSAndroid Build Coastguard Worker
603*08b48e0bSAndroid Build Coastguard Worker if (afl->most_execs_key == 1) {
604*08b48e0bSAndroid Build Coastguard Worker
605*08b48e0bSAndroid Build Coastguard Worker if (afl->most_execs <= afl->fsrv.total_execs) {
606*08b48e0bSAndroid Build Coastguard Worker
607*08b48e0bSAndroid Build Coastguard Worker afl->most_execs_key = 2;
608*08b48e0bSAndroid Build Coastguard Worker afl->stop_soon = 2;
609*08b48e0bSAndroid Build Coastguard Worker
610*08b48e0bSAndroid Build Coastguard Worker }
611*08b48e0bSAndroid Build Coastguard Worker
612*08b48e0bSAndroid Build Coastguard Worker }
613*08b48e0bSAndroid Build Coastguard Worker
614*08b48e0bSAndroid Build Coastguard Worker /* If not enough time has passed since last UI update, bail out. */
615*08b48e0bSAndroid Build Coastguard Worker
616*08b48e0bSAndroid Build Coastguard Worker if (cur_ms - afl->stats_last_ms < 1000 / UI_TARGET_HZ &&
617*08b48e0bSAndroid Build Coastguard Worker !afl->force_ui_update) {
618*08b48e0bSAndroid Build Coastguard Worker
619*08b48e0bSAndroid Build Coastguard Worker return;
620*08b48e0bSAndroid Build Coastguard Worker
621*08b48e0bSAndroid Build Coastguard Worker }
622*08b48e0bSAndroid Build Coastguard Worker
623*08b48e0bSAndroid Build Coastguard Worker /* Check if we're past the 10 minute mark. */
624*08b48e0bSAndroid Build Coastguard Worker
625*08b48e0bSAndroid Build Coastguard Worker if (cur_ms - afl->start_time > 10 * 60 * 1000) { afl->run_over10m = 1; }
626*08b48e0bSAndroid Build Coastguard Worker
627*08b48e0bSAndroid Build Coastguard Worker /* Calculate smoothed exec speed stats. */
628*08b48e0bSAndroid Build Coastguard Worker
629*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!afl->stats_last_execs)) {
630*08b48e0bSAndroid Build Coastguard Worker
631*08b48e0bSAndroid Build Coastguard Worker if (likely(cur_ms != afl->start_time)) {
632*08b48e0bSAndroid Build Coastguard Worker
633*08b48e0bSAndroid Build Coastguard Worker afl->stats_avg_exec = ((double)afl->fsrv.total_execs) * 1000 /
634*08b48e0bSAndroid Build Coastguard Worker (afl->prev_run_time + cur_ms - afl->start_time);
635*08b48e0bSAndroid Build Coastguard Worker
636*08b48e0bSAndroid Build Coastguard Worker }
637*08b48e0bSAndroid Build Coastguard Worker
638*08b48e0bSAndroid Build Coastguard Worker } else {
639*08b48e0bSAndroid Build Coastguard Worker
640*08b48e0bSAndroid Build Coastguard Worker if (likely(cur_ms != afl->stats_last_ms)) {
641*08b48e0bSAndroid Build Coastguard Worker
642*08b48e0bSAndroid Build Coastguard Worker double cur_avg =
643*08b48e0bSAndroid Build Coastguard Worker ((double)(afl->fsrv.total_execs - afl->stats_last_execs)) * 1000 /
644*08b48e0bSAndroid Build Coastguard Worker (cur_ms - afl->stats_last_ms);
645*08b48e0bSAndroid Build Coastguard Worker
646*08b48e0bSAndroid Build Coastguard Worker /* If there is a dramatic (5x+) jump in speed, reset the indicator
647*08b48e0bSAndroid Build Coastguard Worker more quickly. */
648*08b48e0bSAndroid Build Coastguard Worker
649*08b48e0bSAndroid Build Coastguard Worker if (cur_avg * 5 < afl->stats_avg_exec ||
650*08b48e0bSAndroid Build Coastguard Worker cur_avg / 5 > afl->stats_avg_exec) {
651*08b48e0bSAndroid Build Coastguard Worker
652*08b48e0bSAndroid Build Coastguard Worker afl->stats_avg_exec = cur_avg;
653*08b48e0bSAndroid Build Coastguard Worker
654*08b48e0bSAndroid Build Coastguard Worker }
655*08b48e0bSAndroid Build Coastguard Worker
656*08b48e0bSAndroid Build Coastguard Worker afl->stats_avg_exec = afl->stats_avg_exec * (1.0 - 1.0 / AVG_SMOOTHING) +
657*08b48e0bSAndroid Build Coastguard Worker cur_avg * (1.0 / AVG_SMOOTHING);
658*08b48e0bSAndroid Build Coastguard Worker
659*08b48e0bSAndroid Build Coastguard Worker }
660*08b48e0bSAndroid Build Coastguard Worker
661*08b48e0bSAndroid Build Coastguard Worker }
662*08b48e0bSAndroid Build Coastguard Worker
663*08b48e0bSAndroid Build Coastguard Worker afl->stats_last_ms = cur_ms;
664*08b48e0bSAndroid Build Coastguard Worker afl->stats_last_execs = afl->fsrv.total_execs;
665*08b48e0bSAndroid Build Coastguard Worker
666*08b48e0bSAndroid Build Coastguard Worker /* Tell the callers when to contact us (as measured in execs). */
667*08b48e0bSAndroid Build Coastguard Worker
668*08b48e0bSAndroid Build Coastguard Worker afl->stats_update_freq = afl->stats_avg_exec / (UI_TARGET_HZ * 10);
669*08b48e0bSAndroid Build Coastguard Worker if (!afl->stats_update_freq) { afl->stats_update_freq = 1; }
670*08b48e0bSAndroid Build Coastguard Worker
671*08b48e0bSAndroid Build Coastguard Worker /* Do some bitmap stats. */
672*08b48e0bSAndroid Build Coastguard Worker
673*08b48e0bSAndroid Build Coastguard Worker t_bytes = count_non_255_bytes(afl, afl->virgin_bits);
674*08b48e0bSAndroid Build Coastguard Worker t_byte_ratio = ((double)t_bytes * 100) / afl->fsrv.real_map_size;
675*08b48e0bSAndroid Build Coastguard Worker
676*08b48e0bSAndroid Build Coastguard Worker if (unlikely(t_bytes > afl->fsrv.real_map_size)) {
677*08b48e0bSAndroid Build Coastguard Worker
678*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!afl->afl_env.afl_ignore_problems)) {
679*08b48e0bSAndroid Build Coastguard Worker
680*08b48e0bSAndroid Build Coastguard Worker FATAL(
681*08b48e0bSAndroid Build Coastguard Worker "Incorrect fuzzing setup detected. Your target seems to have loaded "
682*08b48e0bSAndroid Build Coastguard Worker "incorrectly instrumented shared libraries (%u of %u/%u). If you use "
683*08b48e0bSAndroid Build Coastguard Worker "LTO mode "
684*08b48e0bSAndroid Build Coastguard Worker "please see instrumentation/README.lto.md. To ignore this problem "
685*08b48e0bSAndroid Build Coastguard Worker "and continue fuzzing just set 'AFL_IGNORE_PROBLEMS=1'.\n",
686*08b48e0bSAndroid Build Coastguard Worker t_bytes, afl->fsrv.real_map_size, afl->fsrv.map_size);
687*08b48e0bSAndroid Build Coastguard Worker
688*08b48e0bSAndroid Build Coastguard Worker }
689*08b48e0bSAndroid Build Coastguard Worker
690*08b48e0bSAndroid Build Coastguard Worker }
691*08b48e0bSAndroid Build Coastguard Worker
692*08b48e0bSAndroid Build Coastguard Worker if (likely(t_bytes) && unlikely(afl->var_byte_count)) {
693*08b48e0bSAndroid Build Coastguard Worker
694*08b48e0bSAndroid Build Coastguard Worker stab_ratio = 100 - (((double)afl->var_byte_count * 100) / t_bytes);
695*08b48e0bSAndroid Build Coastguard Worker
696*08b48e0bSAndroid Build Coastguard Worker } else {
697*08b48e0bSAndroid Build Coastguard Worker
698*08b48e0bSAndroid Build Coastguard Worker stab_ratio = 100;
699*08b48e0bSAndroid Build Coastguard Worker
700*08b48e0bSAndroid Build Coastguard Worker }
701*08b48e0bSAndroid Build Coastguard Worker
702*08b48e0bSAndroid Build Coastguard Worker /* Roughly every minute, update fuzzer stats and save auto tokens. */
703*08b48e0bSAndroid Build Coastguard Worker
704*08b48e0bSAndroid Build Coastguard Worker if (unlikely(
705*08b48e0bSAndroid Build Coastguard Worker !afl->non_instrumented_mode &&
706*08b48e0bSAndroid Build Coastguard Worker (afl->force_ui_update || cur_ms - afl->stats_last_stats_ms >
707*08b48e0bSAndroid Build Coastguard Worker afl->stats_file_update_freq_msecs))) {
708*08b48e0bSAndroid Build Coastguard Worker
709*08b48e0bSAndroid Build Coastguard Worker afl->stats_last_stats_ms = cur_ms;
710*08b48e0bSAndroid Build Coastguard Worker write_stats_file(afl, t_bytes, t_byte_ratio, stab_ratio,
711*08b48e0bSAndroid Build Coastguard Worker afl->stats_avg_exec);
712*08b48e0bSAndroid Build Coastguard Worker save_auto(afl);
713*08b48e0bSAndroid Build Coastguard Worker write_bitmap(afl);
714*08b48e0bSAndroid Build Coastguard Worker
715*08b48e0bSAndroid Build Coastguard Worker }
716*08b48e0bSAndroid Build Coastguard Worker
717*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->afl_env.afl_statsd)) {
718*08b48e0bSAndroid Build Coastguard Worker
719*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->force_ui_update || cur_ms - afl->statsd_last_send_ms >
720*08b48e0bSAndroid Build Coastguard Worker STATSD_UPDATE_SEC * 1000)) {
721*08b48e0bSAndroid Build Coastguard Worker
722*08b48e0bSAndroid Build Coastguard Worker /* reset counter, even if send failed. */
723*08b48e0bSAndroid Build Coastguard Worker afl->statsd_last_send_ms = cur_ms;
724*08b48e0bSAndroid Build Coastguard Worker if (statsd_send_metric(afl)) { WARNF("could not send statsd metric."); }
725*08b48e0bSAndroid Build Coastguard Worker
726*08b48e0bSAndroid Build Coastguard Worker }
727*08b48e0bSAndroid Build Coastguard Worker
728*08b48e0bSAndroid Build Coastguard Worker }
729*08b48e0bSAndroid Build Coastguard Worker
730*08b48e0bSAndroid Build Coastguard Worker /* Every now and then, write plot data. */
731*08b48e0bSAndroid Build Coastguard Worker
732*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->force_ui_update ||
733*08b48e0bSAndroid Build Coastguard Worker cur_ms - afl->stats_last_plot_ms > PLOT_UPDATE_SEC * 1000)) {
734*08b48e0bSAndroid Build Coastguard Worker
735*08b48e0bSAndroid Build Coastguard Worker afl->stats_last_plot_ms = cur_ms;
736*08b48e0bSAndroid Build Coastguard Worker maybe_update_plot_file(afl, t_bytes, t_byte_ratio, afl->stats_avg_exec);
737*08b48e0bSAndroid Build Coastguard Worker
738*08b48e0bSAndroid Build Coastguard Worker }
739*08b48e0bSAndroid Build Coastguard Worker
740*08b48e0bSAndroid Build Coastguard Worker /* Every now and then, write queue data. */
741*08b48e0bSAndroid Build Coastguard Worker
742*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->force_ui_update ||
743*08b48e0bSAndroid Build Coastguard Worker cur_ms - afl->stats_last_queue_ms > QUEUE_UPDATE_SEC * 1000)) {
744*08b48e0bSAndroid Build Coastguard Worker
745*08b48e0bSAndroid Build Coastguard Worker afl->stats_last_queue_ms = cur_ms;
746*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
747*08b48e0bSAndroid Build Coastguard Worker write_queue_stats(afl);
748*08b48e0bSAndroid Build Coastguard Worker #endif
749*08b48e0bSAndroid Build Coastguard Worker
750*08b48e0bSAndroid Build Coastguard Worker }
751*08b48e0bSAndroid Build Coastguard Worker
752*08b48e0bSAndroid Build Coastguard Worker /* Honor AFL_EXIT_WHEN_DONE and AFL_BENCH_UNTIL_CRASH. */
753*08b48e0bSAndroid Build Coastguard Worker
754*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!afl->non_instrumented_mode && afl->cycles_wo_finds > 100 &&
755*08b48e0bSAndroid Build Coastguard Worker !afl->pending_not_fuzzed && afl->afl_env.afl_exit_when_done)) {
756*08b48e0bSAndroid Build Coastguard Worker
757*08b48e0bSAndroid Build Coastguard Worker afl->stop_soon = 2;
758*08b48e0bSAndroid Build Coastguard Worker
759*08b48e0bSAndroid Build Coastguard Worker }
760*08b48e0bSAndroid Build Coastguard Worker
761*08b48e0bSAndroid Build Coastguard Worker /* AFL_EXIT_ON_TIME. */
762*08b48e0bSAndroid Build Coastguard Worker
763*08b48e0bSAndroid Build Coastguard Worker /* If no coverage was found yet, check whether run time is greater than
764*08b48e0bSAndroid Build Coastguard Worker * exit_on_time. */
765*08b48e0bSAndroid Build Coastguard Worker
766*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!afl->non_instrumented_mode && afl->afl_env.afl_exit_on_time &&
767*08b48e0bSAndroid Build Coastguard Worker ((afl->last_find_time &&
768*08b48e0bSAndroid Build Coastguard Worker (cur_ms - afl->last_find_time) > afl->exit_on_time) ||
769*08b48e0bSAndroid Build Coastguard Worker (!afl->last_find_time &&
770*08b48e0bSAndroid Build Coastguard Worker (cur_ms - afl->start_time) > afl->exit_on_time)))) {
771*08b48e0bSAndroid Build Coastguard Worker
772*08b48e0bSAndroid Build Coastguard Worker afl->stop_soon = 2;
773*08b48e0bSAndroid Build Coastguard Worker
774*08b48e0bSAndroid Build Coastguard Worker }
775*08b48e0bSAndroid Build Coastguard Worker
776*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->total_crashes && afl->afl_env.afl_bench_until_crash)) {
777*08b48e0bSAndroid Build Coastguard Worker
778*08b48e0bSAndroid Build Coastguard Worker afl->stop_soon = 2;
779*08b48e0bSAndroid Build Coastguard Worker
780*08b48e0bSAndroid Build Coastguard Worker }
781*08b48e0bSAndroid Build Coastguard Worker
782*08b48e0bSAndroid Build Coastguard Worker /* If we're not on TTY, bail out. */
783*08b48e0bSAndroid Build Coastguard Worker
784*08b48e0bSAndroid Build Coastguard Worker if (afl->not_on_tty) { return; }
785*08b48e0bSAndroid Build Coastguard Worker
786*08b48e0bSAndroid Build Coastguard Worker /* If we haven't started doing things, bail out. */
787*08b48e0bSAndroid Build Coastguard Worker
788*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!afl->queue_cur)) { return; }
789*08b48e0bSAndroid Build Coastguard Worker
790*08b48e0bSAndroid Build Coastguard Worker /* Compute some mildly useful bitmap stats. */
791*08b48e0bSAndroid Build Coastguard Worker
792*08b48e0bSAndroid Build Coastguard Worker t_bits = (afl->fsrv.map_size << 3) - count_bits(afl, afl->virgin_bits);
793*08b48e0bSAndroid Build Coastguard Worker
794*08b48e0bSAndroid Build Coastguard Worker /* Now, for the visuals... */
795*08b48e0bSAndroid Build Coastguard Worker
796*08b48e0bSAndroid Build Coastguard Worker if (afl->clear_screen) {
797*08b48e0bSAndroid Build Coastguard Worker
798*08b48e0bSAndroid Build Coastguard Worker SAYF(TERM_CLEAR CURSOR_HIDE);
799*08b48e0bSAndroid Build Coastguard Worker afl->clear_screen = 0;
800*08b48e0bSAndroid Build Coastguard Worker
801*08b48e0bSAndroid Build Coastguard Worker check_term_size(afl);
802*08b48e0bSAndroid Build Coastguard Worker
803*08b48e0bSAndroid Build Coastguard Worker }
804*08b48e0bSAndroid Build Coastguard Worker
805*08b48e0bSAndroid Build Coastguard Worker SAYF(TERM_HOME);
806*08b48e0bSAndroid Build Coastguard Worker
807*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->term_too_small)) {
808*08b48e0bSAndroid Build Coastguard Worker
809*08b48e0bSAndroid Build Coastguard Worker SAYF(cBRI
810*08b48e0bSAndroid Build Coastguard Worker "Your terminal is too small to display the UI.\n"
811*08b48e0bSAndroid Build Coastguard Worker "Please resize terminal window to at least 79x24.\n" cRST);
812*08b48e0bSAndroid Build Coastguard Worker
813*08b48e0bSAndroid Build Coastguard Worker return;
814*08b48e0bSAndroid Build Coastguard Worker
815*08b48e0bSAndroid Build Coastguard Worker }
816*08b48e0bSAndroid Build Coastguard Worker
817*08b48e0bSAndroid Build Coastguard Worker /* Let's start by drawing a centered banner. */
818*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!banner[0])) {
819*08b48e0bSAndroid Build Coastguard Worker
820*08b48e0bSAndroid Build Coastguard Worker char *si = "";
821*08b48e0bSAndroid Build Coastguard Worker char *fuzzer_name;
822*08b48e0bSAndroid Build Coastguard Worker
823*08b48e0bSAndroid Build Coastguard Worker if (afl->sync_id) { si = afl->sync_id; }
824*08b48e0bSAndroid Build Coastguard Worker memset(banner, 0, sizeof(banner));
825*08b48e0bSAndroid Build Coastguard Worker
826*08b48e0bSAndroid Build Coastguard Worker banner_len = strlen(VERSION) + strlen(si) + strlen(afl->power_name) + 4 + 6;
827*08b48e0bSAndroid Build Coastguard Worker
828*08b48e0bSAndroid Build Coastguard Worker if (afl->crash_mode) {
829*08b48e0bSAndroid Build Coastguard Worker
830*08b48e0bSAndroid Build Coastguard Worker fuzzer_name = "peruvian were-rabbit";
831*08b48e0bSAndroid Build Coastguard Worker
832*08b48e0bSAndroid Build Coastguard Worker } else {
833*08b48e0bSAndroid Build Coastguard Worker
834*08b48e0bSAndroid Build Coastguard Worker fuzzer_name = "american fuzzy lop";
835*08b48e0bSAndroid Build Coastguard Worker if (banner_len + strlen(fuzzer_name) + strlen(afl->use_banner) > 75) {
836*08b48e0bSAndroid Build Coastguard Worker
837*08b48e0bSAndroid Build Coastguard Worker fuzzer_name = "AFL";
838*08b48e0bSAndroid Build Coastguard Worker
839*08b48e0bSAndroid Build Coastguard Worker }
840*08b48e0bSAndroid Build Coastguard Worker
841*08b48e0bSAndroid Build Coastguard Worker }
842*08b48e0bSAndroid Build Coastguard Worker
843*08b48e0bSAndroid Build Coastguard Worker banner_len += strlen(fuzzer_name);
844*08b48e0bSAndroid Build Coastguard Worker
845*08b48e0bSAndroid Build Coastguard Worker if (strlen(afl->use_banner) + banner_len > 75) {
846*08b48e0bSAndroid Build Coastguard Worker
847*08b48e0bSAndroid Build Coastguard Worker afl->use_banner += (strlen(afl->use_banner) + banner_len) - 76;
848*08b48e0bSAndroid Build Coastguard Worker memset(afl->use_banner, '.', 3);
849*08b48e0bSAndroid Build Coastguard Worker
850*08b48e0bSAndroid Build Coastguard Worker }
851*08b48e0bSAndroid Build Coastguard Worker
852*08b48e0bSAndroid Build Coastguard Worker banner_len += strlen(afl->use_banner);
853*08b48e0bSAndroid Build Coastguard Worker banner_pad = (79 - banner_len) / 2;
854*08b48e0bSAndroid Build Coastguard Worker memset(banner, ' ', banner_pad);
855*08b48e0bSAndroid Build Coastguard Worker
856*08b48e0bSAndroid Build Coastguard Worker #ifdef __linux__
857*08b48e0bSAndroid Build Coastguard Worker if (afl->fsrv.nyx_mode) {
858*08b48e0bSAndroid Build Coastguard Worker
859*08b48e0bSAndroid Build Coastguard Worker snprintf(banner + banner_pad, sizeof(banner) - banner_pad,
860*08b48e0bSAndroid Build Coastguard Worker "%s%s " cLCY VERSION cLBL " {%s} " cLGN "(%s) " cPIN
861*08b48e0bSAndroid Build Coastguard Worker "[%s] - Nyx",
862*08b48e0bSAndroid Build Coastguard Worker afl->crash_mode ? cPIN : cYEL, fuzzer_name, si, afl->use_banner,
863*08b48e0bSAndroid Build Coastguard Worker afl->power_name);
864*08b48e0bSAndroid Build Coastguard Worker
865*08b48e0bSAndroid Build Coastguard Worker } else {
866*08b48e0bSAndroid Build Coastguard Worker
867*08b48e0bSAndroid Build Coastguard Worker #endif
868*08b48e0bSAndroid Build Coastguard Worker snprintf(banner + banner_pad, sizeof(banner) - banner_pad,
869*08b48e0bSAndroid Build Coastguard Worker "%s%s " cLCY VERSION cLBL " {%s} " cLGN "(%s) " cPIN "[%s]",
870*08b48e0bSAndroid Build Coastguard Worker afl->crash_mode ? cPIN : cYEL, fuzzer_name, si, afl->use_banner,
871*08b48e0bSAndroid Build Coastguard Worker afl->power_name);
872*08b48e0bSAndroid Build Coastguard Worker
873*08b48e0bSAndroid Build Coastguard Worker #ifdef __linux__
874*08b48e0bSAndroid Build Coastguard Worker
875*08b48e0bSAndroid Build Coastguard Worker }
876*08b48e0bSAndroid Build Coastguard Worker
877*08b48e0bSAndroid Build Coastguard Worker #endif
878*08b48e0bSAndroid Build Coastguard Worker
879*08b48e0bSAndroid Build Coastguard Worker }
880*08b48e0bSAndroid Build Coastguard Worker
881*08b48e0bSAndroid Build Coastguard Worker SAYF("\n%s\n", banner);
882*08b48e0bSAndroid Build Coastguard Worker
883*08b48e0bSAndroid Build Coastguard Worker /* "Handy" shortcuts for drawing boxes... */
884*08b48e0bSAndroid Build Coastguard Worker
885*08b48e0bSAndroid Build Coastguard Worker #define bSTG bSTART cGRA
886*08b48e0bSAndroid Build Coastguard Worker #define bH2 bH bH
887*08b48e0bSAndroid Build Coastguard Worker #define bH5 bH2 bH2 bH
888*08b48e0bSAndroid Build Coastguard Worker #define bH10 bH5 bH5
889*08b48e0bSAndroid Build Coastguard Worker #define bH20 bH10 bH10
890*08b48e0bSAndroid Build Coastguard Worker #define bH30 bH20 bH10
891*08b48e0bSAndroid Build Coastguard Worker #define SP5 " "
892*08b48e0bSAndroid Build Coastguard Worker #define SP10 SP5 SP5
893*08b48e0bSAndroid Build Coastguard Worker #define SP20 SP10 SP10
894*08b48e0bSAndroid Build Coastguard Worker
895*08b48e0bSAndroid Build Coastguard Worker /* Since `total_crashes` does not get reloaded from disk on restart,
896*08b48e0bSAndroid Build Coastguard Worker it indicates if we found crashes this round already -> paint red.
897*08b48e0bSAndroid Build Coastguard Worker If it's 0, but `saved_crashes` is set from a past run, paint in yellow. */
898*08b48e0bSAndroid Build Coastguard Worker char *crash_color = afl->total_crashes ? cLRD
899*08b48e0bSAndroid Build Coastguard Worker : afl->saved_crashes ? cYEL
900*08b48e0bSAndroid Build Coastguard Worker : cRST;
901*08b48e0bSAndroid Build Coastguard Worker
902*08b48e0bSAndroid Build Coastguard Worker /* Lord, forgive me this. */
903*08b48e0bSAndroid Build Coastguard Worker
904*08b48e0bSAndroid Build Coastguard Worker SAYF(SET_G1 bSTG bLT bH bSTOP cCYA
905*08b48e0bSAndroid Build Coastguard Worker " process timing " bSTG bH30 bH5 bH bHB bH bSTOP cCYA
906*08b48e0bSAndroid Build Coastguard Worker " overall results " bSTG bH2 bH2 bRT "\n");
907*08b48e0bSAndroid Build Coastguard Worker
908*08b48e0bSAndroid Build Coastguard Worker if (afl->non_instrumented_mode) {
909*08b48e0bSAndroid Build Coastguard Worker
910*08b48e0bSAndroid Build Coastguard Worker strcpy(tmp, cRST);
911*08b48e0bSAndroid Build Coastguard Worker
912*08b48e0bSAndroid Build Coastguard Worker } else {
913*08b48e0bSAndroid Build Coastguard Worker
914*08b48e0bSAndroid Build Coastguard Worker u64 min_wo_finds = (cur_ms - afl->last_find_time) / 1000 / 60;
915*08b48e0bSAndroid Build Coastguard Worker
916*08b48e0bSAndroid Build Coastguard Worker /* First queue cycle: don't stop now! */
917*08b48e0bSAndroid Build Coastguard Worker if (afl->queue_cycle == 1 || min_wo_finds < 15) {
918*08b48e0bSAndroid Build Coastguard Worker
919*08b48e0bSAndroid Build Coastguard Worker strcpy(tmp, cMGN);
920*08b48e0bSAndroid Build Coastguard Worker
921*08b48e0bSAndroid Build Coastguard Worker } else
922*08b48e0bSAndroid Build Coastguard Worker
923*08b48e0bSAndroid Build Coastguard Worker /* Subsequent cycles, but we're still making finds. */
924*08b48e0bSAndroid Build Coastguard Worker if (afl->cycles_wo_finds < 25 || min_wo_finds < 30) {
925*08b48e0bSAndroid Build Coastguard Worker
926*08b48e0bSAndroid Build Coastguard Worker strcpy(tmp, cYEL);
927*08b48e0bSAndroid Build Coastguard Worker
928*08b48e0bSAndroid Build Coastguard Worker } else
929*08b48e0bSAndroid Build Coastguard Worker
930*08b48e0bSAndroid Build Coastguard Worker /* No finds for a long time and no test cases to try. */
931*08b48e0bSAndroid Build Coastguard Worker if (afl->cycles_wo_finds > 100 && !afl->pending_not_fuzzed &&
932*08b48e0bSAndroid Build Coastguard Worker min_wo_finds > 120) {
933*08b48e0bSAndroid Build Coastguard Worker
934*08b48e0bSAndroid Build Coastguard Worker strcpy(tmp, cLGN);
935*08b48e0bSAndroid Build Coastguard Worker
936*08b48e0bSAndroid Build Coastguard Worker /* Default: cautiously OK to stop? */
937*08b48e0bSAndroid Build Coastguard Worker
938*08b48e0bSAndroid Build Coastguard Worker } else {
939*08b48e0bSAndroid Build Coastguard Worker
940*08b48e0bSAndroid Build Coastguard Worker strcpy(tmp, cLBL);
941*08b48e0bSAndroid Build Coastguard Worker
942*08b48e0bSAndroid Build Coastguard Worker }
943*08b48e0bSAndroid Build Coastguard Worker
944*08b48e0bSAndroid Build Coastguard Worker }
945*08b48e0bSAndroid Build Coastguard Worker
946*08b48e0bSAndroid Build Coastguard Worker u_stringify_time_diff(time_tmp, afl->prev_run_time + cur_ms, afl->start_time);
947*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP " run time : " cRST "%-33s " bSTG bV bSTOP
948*08b48e0bSAndroid Build Coastguard Worker " cycles done : %s%-5s " bSTG bV "\n",
949*08b48e0bSAndroid Build Coastguard Worker time_tmp, tmp, u_stringify_int(IB(0), afl->queue_cycle - 1));
950*08b48e0bSAndroid Build Coastguard Worker
951*08b48e0bSAndroid Build Coastguard Worker /* We want to warn people about not seeing new paths after a full cycle,
952*08b48e0bSAndroid Build Coastguard Worker except when resuming fuzzing or running in non-instrumented mode. */
953*08b48e0bSAndroid Build Coastguard Worker
954*08b48e0bSAndroid Build Coastguard Worker if (!afl->non_instrumented_mode &&
955*08b48e0bSAndroid Build Coastguard Worker (afl->last_find_time || afl->resuming_fuzz || afl->queue_cycle == 1 ||
956*08b48e0bSAndroid Build Coastguard Worker afl->in_bitmap || afl->crash_mode)) {
957*08b48e0bSAndroid Build Coastguard Worker
958*08b48e0bSAndroid Build Coastguard Worker u_stringify_time_diff(time_tmp, cur_ms, afl->last_find_time);
959*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP " last new find : " cRST "%-33s ", time_tmp);
960*08b48e0bSAndroid Build Coastguard Worker
961*08b48e0bSAndroid Build Coastguard Worker } else {
962*08b48e0bSAndroid Build Coastguard Worker
963*08b48e0bSAndroid Build Coastguard Worker if (afl->non_instrumented_mode) {
964*08b48e0bSAndroid Build Coastguard Worker
965*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP " last new find : " cPIN "n/a" cRST
966*08b48e0bSAndroid Build Coastguard Worker " (non-instrumented mode) ");
967*08b48e0bSAndroid Build Coastguard Worker
968*08b48e0bSAndroid Build Coastguard Worker } else {
969*08b48e0bSAndroid Build Coastguard Worker
970*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP " last new find : " cRST "none yet " cLRD
971*08b48e0bSAndroid Build Coastguard Worker "(odd, check syntax!) ");
972*08b48e0bSAndroid Build Coastguard Worker
973*08b48e0bSAndroid Build Coastguard Worker }
974*08b48e0bSAndroid Build Coastguard Worker
975*08b48e0bSAndroid Build Coastguard Worker }
976*08b48e0bSAndroid Build Coastguard Worker
977*08b48e0bSAndroid Build Coastguard Worker SAYF(bSTG bV bSTOP " corpus count : " cRST "%-5s " bSTG bV "\n",
978*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(0), afl->queued_items));
979*08b48e0bSAndroid Build Coastguard Worker
980*08b48e0bSAndroid Build Coastguard Worker /* Highlight crashes in red if found, denote going over the KEEP_UNIQUE_CRASH
981*08b48e0bSAndroid Build Coastguard Worker limit with a '+' appended to the count. */
982*08b48e0bSAndroid Build Coastguard Worker
983*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s%s", u_stringify_int(IB(0), afl->saved_crashes),
984*08b48e0bSAndroid Build Coastguard Worker (afl->saved_crashes >= KEEP_UNIQUE_CRASH) ? "+" : "");
985*08b48e0bSAndroid Build Coastguard Worker
986*08b48e0bSAndroid Build Coastguard Worker u_stringify_time_diff(time_tmp, cur_ms, afl->last_crash_time);
987*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP "last saved crash : " cRST "%-33s " bSTG bV bSTOP
988*08b48e0bSAndroid Build Coastguard Worker "saved crashes : %s%-6s" bSTG bV "\n",
989*08b48e0bSAndroid Build Coastguard Worker time_tmp, crash_color, tmp);
990*08b48e0bSAndroid Build Coastguard Worker
991*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s%s", u_stringify_int(IB(0), afl->saved_hangs),
992*08b48e0bSAndroid Build Coastguard Worker (afl->saved_hangs >= KEEP_UNIQUE_HANG) ? "+" : "");
993*08b48e0bSAndroid Build Coastguard Worker
994*08b48e0bSAndroid Build Coastguard Worker u_stringify_time_diff(time_tmp, cur_ms, afl->last_hang_time);
995*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP " last saved hang : " cRST "%-33s " bSTG bV bSTOP
996*08b48e0bSAndroid Build Coastguard Worker " saved hangs : " cRST "%-6s" bSTG bV "\n",
997*08b48e0bSAndroid Build Coastguard Worker time_tmp, tmp);
998*08b48e0bSAndroid Build Coastguard Worker
999*08b48e0bSAndroid Build Coastguard Worker SAYF(bVR bH bSTOP cCYA
1000*08b48e0bSAndroid Build Coastguard Worker " cycle progress " bSTG bH10 bH5 bH2 bH2 bH2 bHB bH bSTOP cCYA
1001*08b48e0bSAndroid Build Coastguard Worker " map coverage" bSTG bHT bH20 bH2 bVL "\n");
1002*08b48e0bSAndroid Build Coastguard Worker
1003*08b48e0bSAndroid Build Coastguard Worker /* This gets funny because we want to print several variable-length variables
1004*08b48e0bSAndroid Build Coastguard Worker together, but then cram them into a fixed-width field - so we need to
1005*08b48e0bSAndroid Build Coastguard Worker put them in a temporary buffer first. */
1006*08b48e0bSAndroid Build Coastguard Worker
1007*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s%s%u (%0.01f%%)", u_stringify_int(IB(0), afl->current_entry),
1008*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->favored ? "." : "*", afl->queue_cur->fuzz_level,
1009*08b48e0bSAndroid Build Coastguard Worker ((double)afl->current_entry * 100) / afl->queued_items);
1010*08b48e0bSAndroid Build Coastguard Worker
1011*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP " now processing : " cRST "%-18s " bSTG bV bSTOP, tmp);
1012*08b48e0bSAndroid Build Coastguard Worker
1013*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%0.02f%% / %0.02f%%",
1014*08b48e0bSAndroid Build Coastguard Worker ((double)afl->queue_cur->bitmap_size) * 100 / afl->fsrv.real_map_size,
1015*08b48e0bSAndroid Build Coastguard Worker t_byte_ratio);
1016*08b48e0bSAndroid Build Coastguard Worker
1017*08b48e0bSAndroid Build Coastguard Worker SAYF(" map density : %s%-19s" bSTG bV "\n",
1018*08b48e0bSAndroid Build Coastguard Worker t_byte_ratio > 70
1019*08b48e0bSAndroid Build Coastguard Worker ? cLRD
1020*08b48e0bSAndroid Build Coastguard Worker : ((t_bytes < 200 && !afl->non_instrumented_mode) ? cPIN : cRST),
1021*08b48e0bSAndroid Build Coastguard Worker tmp);
1022*08b48e0bSAndroid Build Coastguard Worker
1023*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s (%0.02f%%)", u_stringify_int(IB(0), afl->cur_skipped_items),
1024*08b48e0bSAndroid Build Coastguard Worker ((double)afl->cur_skipped_items * 100) / afl->queued_items);
1025*08b48e0bSAndroid Build Coastguard Worker
1026*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP " runs timed out : " cRST "%-18s " bSTG bV, tmp);
1027*08b48e0bSAndroid Build Coastguard Worker
1028*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%0.02f bits/tuple", t_bytes ? (((double)t_bits) / t_bytes) : 0);
1029*08b48e0bSAndroid Build Coastguard Worker
1030*08b48e0bSAndroid Build Coastguard Worker SAYF(bSTOP " count coverage : " cRST "%-19s" bSTG bV "\n", tmp);
1031*08b48e0bSAndroid Build Coastguard Worker
1032*08b48e0bSAndroid Build Coastguard Worker SAYF(bVR bH bSTOP cCYA
1033*08b48e0bSAndroid Build Coastguard Worker " stage progress " bSTG bH10 bH5 bH2 bH2 bH2 bX bH bSTOP cCYA
1034*08b48e0bSAndroid Build Coastguard Worker " findings in depth " bSTG bH10 bH5 bH2 bVL "\n");
1035*08b48e0bSAndroid Build Coastguard Worker
1036*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s (%0.02f%%)", u_stringify_int(IB(0), afl->queued_favored),
1037*08b48e0bSAndroid Build Coastguard Worker ((double)afl->queued_favored) * 100 / afl->queued_items);
1038*08b48e0bSAndroid Build Coastguard Worker
1039*08b48e0bSAndroid Build Coastguard Worker /* Yeah... it's still going on... halp? */
1040*08b48e0bSAndroid Build Coastguard Worker
1041*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP " now trying : " cRST "%-22s " bSTG bV bSTOP
1042*08b48e0bSAndroid Build Coastguard Worker " favored items : " cRST "%-20s" bSTG bV "\n",
1043*08b48e0bSAndroid Build Coastguard Worker afl->stage_name, tmp);
1044*08b48e0bSAndroid Build Coastguard Worker
1045*08b48e0bSAndroid Build Coastguard Worker if (!afl->stage_max) {
1046*08b48e0bSAndroid Build Coastguard Worker
1047*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s/-", u_stringify_int(IB(0), afl->stage_cur));
1048*08b48e0bSAndroid Build Coastguard Worker
1049*08b48e0bSAndroid Build Coastguard Worker } else {
1050*08b48e0bSAndroid Build Coastguard Worker
1051*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s/%s (%0.02f%%)", u_stringify_int(IB(0), afl->stage_cur),
1052*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(1), afl->stage_max),
1053*08b48e0bSAndroid Build Coastguard Worker ((double)afl->stage_cur) * 100 / afl->stage_max);
1054*08b48e0bSAndroid Build Coastguard Worker
1055*08b48e0bSAndroid Build Coastguard Worker }
1056*08b48e0bSAndroid Build Coastguard Worker
1057*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP " stage execs : " cRST "%-23s" bSTG bV bSTOP, tmp);
1058*08b48e0bSAndroid Build Coastguard Worker
1059*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s (%0.02f%%)", u_stringify_int(IB(0), afl->queued_with_cov),
1060*08b48e0bSAndroid Build Coastguard Worker ((double)afl->queued_with_cov) * 100 / afl->queued_items);
1061*08b48e0bSAndroid Build Coastguard Worker
1062*08b48e0bSAndroid Build Coastguard Worker SAYF(" new edges on : " cRST "%-20s" bSTG bV "\n", tmp);
1063*08b48e0bSAndroid Build Coastguard Worker
1064*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s (%s%s saved)", u_stringify_int(IB(0), afl->total_crashes),
1065*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(1), afl->saved_crashes),
1066*08b48e0bSAndroid Build Coastguard Worker (afl->saved_crashes >= KEEP_UNIQUE_CRASH) ? "+" : "");
1067*08b48e0bSAndroid Build Coastguard Worker
1068*08b48e0bSAndroid Build Coastguard Worker if (afl->crash_mode) {
1069*08b48e0bSAndroid Build Coastguard Worker
1070*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP " total execs : " cRST "%-22s " bSTG bV bSTOP
1071*08b48e0bSAndroid Build Coastguard Worker " new crashes : %s%-20s" bSTG bV "\n",
1072*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(0), afl->fsrv.total_execs), crash_color, tmp);
1073*08b48e0bSAndroid Build Coastguard Worker
1074*08b48e0bSAndroid Build Coastguard Worker } else {
1075*08b48e0bSAndroid Build Coastguard Worker
1076*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP " total execs : " cRST "%-22s " bSTG bV bSTOP
1077*08b48e0bSAndroid Build Coastguard Worker " total crashes : %s%-20s" bSTG bV "\n",
1078*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(0), afl->fsrv.total_execs), crash_color, tmp);
1079*08b48e0bSAndroid Build Coastguard Worker
1080*08b48e0bSAndroid Build Coastguard Worker }
1081*08b48e0bSAndroid Build Coastguard Worker
1082*08b48e0bSAndroid Build Coastguard Worker /* Show a warning about slow execution. */
1083*08b48e0bSAndroid Build Coastguard Worker
1084*08b48e0bSAndroid Build Coastguard Worker if (afl->stats_avg_exec < 100) {
1085*08b48e0bSAndroid Build Coastguard Worker
1086*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s/sec (%s)", u_stringify_float(IB(0), afl->stats_avg_exec),
1087*08b48e0bSAndroid Build Coastguard Worker afl->stats_avg_exec < 20 ? "zzzz..." : "slow!");
1088*08b48e0bSAndroid Build Coastguard Worker
1089*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP " exec speed : " cLRD "%-22s ", tmp);
1090*08b48e0bSAndroid Build Coastguard Worker
1091*08b48e0bSAndroid Build Coastguard Worker } else {
1092*08b48e0bSAndroid Build Coastguard Worker
1093*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s/sec", u_stringify_float(IB(0), afl->stats_avg_exec));
1094*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP " exec speed : " cRST "%-22s ", tmp);
1095*08b48e0bSAndroid Build Coastguard Worker
1096*08b48e0bSAndroid Build Coastguard Worker }
1097*08b48e0bSAndroid Build Coastguard Worker
1098*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s (%s%s saved)", u_stringify_int(IB(0), afl->total_tmouts),
1099*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(1), afl->saved_tmouts),
1100*08b48e0bSAndroid Build Coastguard Worker (afl->saved_tmouts >= KEEP_UNIQUE_HANG) ? "+" : "");
1101*08b48e0bSAndroid Build Coastguard Worker
1102*08b48e0bSAndroid Build Coastguard Worker SAYF(bSTG bV bSTOP " total tmouts : " cRST "%-20s" bSTG bV "\n", tmp);
1103*08b48e0bSAndroid Build Coastguard Worker
1104*08b48e0bSAndroid Build Coastguard Worker /* Aaaalmost there... hold on! */
1105*08b48e0bSAndroid Build Coastguard Worker
1106*08b48e0bSAndroid Build Coastguard Worker SAYF(bVR bH cCYA bSTOP " fuzzing strategy yields " bSTG bH10 bH2 bHT bH10 bH2
1107*08b48e0bSAndroid Build Coastguard Worker bH bHB bH bSTOP cCYA " item geometry " bSTG bH5 bH2 bVL "\n");
1108*08b48e0bSAndroid Build Coastguard Worker
1109*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->custom_only)) {
1110*08b48e0bSAndroid Build Coastguard Worker
1111*08b48e0bSAndroid Build Coastguard Worker strcpy(tmp, "disabled (custom-mutator-only mode)");
1112*08b48e0bSAndroid Build Coastguard Worker
1113*08b48e0bSAndroid Build Coastguard Worker } else if (likely(afl->skip_deterministic)) {
1114*08b48e0bSAndroid Build Coastguard Worker
1115*08b48e0bSAndroid Build Coastguard Worker strcpy(tmp, "disabled (default, enable with -D)");
1116*08b48e0bSAndroid Build Coastguard Worker
1117*08b48e0bSAndroid Build Coastguard Worker } else {
1118*08b48e0bSAndroid Build Coastguard Worker
1119*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s/%s, %s/%s, %s/%s",
1120*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(0), afl->stage_finds[STAGE_FLIP1]),
1121*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(1), afl->stage_cycles[STAGE_FLIP1]),
1122*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(2), afl->stage_finds[STAGE_FLIP2]),
1123*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(3), afl->stage_cycles[STAGE_FLIP2]),
1124*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(4), afl->stage_finds[STAGE_FLIP4]),
1125*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(5), afl->stage_cycles[STAGE_FLIP4]));
1126*08b48e0bSAndroid Build Coastguard Worker
1127*08b48e0bSAndroid Build Coastguard Worker }
1128*08b48e0bSAndroid Build Coastguard Worker
1129*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP " bit flips : " cRST "%-36s " bSTG bV bSTOP
1130*08b48e0bSAndroid Build Coastguard Worker " levels : " cRST "%-10s" bSTG bV "\n",
1131*08b48e0bSAndroid Build Coastguard Worker tmp, u_stringify_int(IB(0), afl->max_depth));
1132*08b48e0bSAndroid Build Coastguard Worker
1133*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!afl->skip_deterministic)) {
1134*08b48e0bSAndroid Build Coastguard Worker
1135*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s/%s, %s/%s, %s/%s",
1136*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(0), afl->stage_finds[STAGE_FLIP8]),
1137*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(1), afl->stage_cycles[STAGE_FLIP8]),
1138*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(2), afl->stage_finds[STAGE_FLIP16]),
1139*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(3), afl->stage_cycles[STAGE_FLIP16]),
1140*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(4), afl->stage_finds[STAGE_FLIP32]),
1141*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(5), afl->stage_cycles[STAGE_FLIP32]));
1142*08b48e0bSAndroid Build Coastguard Worker
1143*08b48e0bSAndroid Build Coastguard Worker }
1144*08b48e0bSAndroid Build Coastguard Worker
1145*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP " byte flips : " cRST "%-36s " bSTG bV bSTOP
1146*08b48e0bSAndroid Build Coastguard Worker " pending : " cRST "%-10s" bSTG bV "\n",
1147*08b48e0bSAndroid Build Coastguard Worker tmp, u_stringify_int(IB(0), afl->pending_not_fuzzed));
1148*08b48e0bSAndroid Build Coastguard Worker
1149*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!afl->skip_deterministic)) {
1150*08b48e0bSAndroid Build Coastguard Worker
1151*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s/%s, %s/%s, %s/%s",
1152*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(0), afl->stage_finds[STAGE_ARITH8]),
1153*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(1), afl->stage_cycles[STAGE_ARITH8]),
1154*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(2), afl->stage_finds[STAGE_ARITH16]),
1155*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(3), afl->stage_cycles[STAGE_ARITH16]),
1156*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(4), afl->stage_finds[STAGE_ARITH32]),
1157*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(5), afl->stage_cycles[STAGE_ARITH32]));
1158*08b48e0bSAndroid Build Coastguard Worker
1159*08b48e0bSAndroid Build Coastguard Worker }
1160*08b48e0bSAndroid Build Coastguard Worker
1161*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP " arithmetics : " cRST "%-36s " bSTG bV bSTOP
1162*08b48e0bSAndroid Build Coastguard Worker " pend fav : " cRST "%-10s" bSTG bV "\n",
1163*08b48e0bSAndroid Build Coastguard Worker tmp, u_stringify_int(IB(0), afl->pending_favored));
1164*08b48e0bSAndroid Build Coastguard Worker
1165*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!afl->skip_deterministic)) {
1166*08b48e0bSAndroid Build Coastguard Worker
1167*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s/%s, %s/%s, %s/%s",
1168*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(0), afl->stage_finds[STAGE_INTEREST8]),
1169*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(1), afl->stage_cycles[STAGE_INTEREST8]),
1170*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(2), afl->stage_finds[STAGE_INTEREST16]),
1171*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(3), afl->stage_cycles[STAGE_INTEREST16]),
1172*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(4), afl->stage_finds[STAGE_INTEREST32]),
1173*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(5), afl->stage_cycles[STAGE_INTEREST32]));
1174*08b48e0bSAndroid Build Coastguard Worker
1175*08b48e0bSAndroid Build Coastguard Worker }
1176*08b48e0bSAndroid Build Coastguard Worker
1177*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP " known ints : " cRST "%-36s " bSTG bV bSTOP
1178*08b48e0bSAndroid Build Coastguard Worker " own finds : " cRST "%-10s" bSTG bV "\n",
1179*08b48e0bSAndroid Build Coastguard Worker tmp, u_stringify_int(IB(0), afl->queued_discovered));
1180*08b48e0bSAndroid Build Coastguard Worker
1181*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!afl->skip_deterministic)) {
1182*08b48e0bSAndroid Build Coastguard Worker
1183*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s/%s, %s/%s, %s/%s, %s/%s",
1184*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(0), afl->stage_finds[STAGE_EXTRAS_UO]),
1185*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(1), afl->stage_cycles[STAGE_EXTRAS_UO]),
1186*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(2), afl->stage_finds[STAGE_EXTRAS_UI]),
1187*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(3), afl->stage_cycles[STAGE_EXTRAS_UI]),
1188*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(4), afl->stage_finds[STAGE_EXTRAS_AO]),
1189*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(5), afl->stage_cycles[STAGE_EXTRAS_AO]),
1190*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(6), afl->stage_finds[STAGE_EXTRAS_AI]),
1191*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(7), afl->stage_cycles[STAGE_EXTRAS_AI]));
1192*08b48e0bSAndroid Build Coastguard Worker
1193*08b48e0bSAndroid Build Coastguard Worker } else if (unlikely(!afl->extras_cnt || afl->custom_only)) {
1194*08b48e0bSAndroid Build Coastguard Worker
1195*08b48e0bSAndroid Build Coastguard Worker strcpy(tmp, "n/a");
1196*08b48e0bSAndroid Build Coastguard Worker
1197*08b48e0bSAndroid Build Coastguard Worker } else {
1198*08b48e0bSAndroid Build Coastguard Worker
1199*08b48e0bSAndroid Build Coastguard Worker strcpy(tmp, "havoc mode");
1200*08b48e0bSAndroid Build Coastguard Worker
1201*08b48e0bSAndroid Build Coastguard Worker }
1202*08b48e0bSAndroid Build Coastguard Worker
1203*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP " dictionary : " cRST "%-36s " bSTG bV bSTOP
1204*08b48e0bSAndroid Build Coastguard Worker " imported : " cRST "%-10s" bSTG bV "\n",
1205*08b48e0bSAndroid Build Coastguard Worker tmp,
1206*08b48e0bSAndroid Build Coastguard Worker afl->sync_id ? u_stringify_int(IB(0), afl->queued_imported)
1207*08b48e0bSAndroid Build Coastguard Worker : (u8 *)"n/a");
1208*08b48e0bSAndroid Build Coastguard Worker
1209*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s/%s, %s/%s",
1210*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(0), afl->stage_finds[STAGE_HAVOC]),
1211*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(2), afl->stage_cycles[STAGE_HAVOC]),
1212*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(3), afl->stage_finds[STAGE_SPLICE]),
1213*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(4), afl->stage_cycles[STAGE_SPLICE]));
1214*08b48e0bSAndroid Build Coastguard Worker
1215*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP "havoc/splice : " cRST "%-36s " bSTG bV bSTOP, tmp);
1216*08b48e0bSAndroid Build Coastguard Worker
1217*08b48e0bSAndroid Build Coastguard Worker if (t_bytes) {
1218*08b48e0bSAndroid Build Coastguard Worker
1219*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%0.02f%%", stab_ratio);
1220*08b48e0bSAndroid Build Coastguard Worker
1221*08b48e0bSAndroid Build Coastguard Worker } else {
1222*08b48e0bSAndroid Build Coastguard Worker
1223*08b48e0bSAndroid Build Coastguard Worker strcpy(tmp, "n/a");
1224*08b48e0bSAndroid Build Coastguard Worker
1225*08b48e0bSAndroid Build Coastguard Worker }
1226*08b48e0bSAndroid Build Coastguard Worker
1227*08b48e0bSAndroid Build Coastguard Worker SAYF(" stability : %s%-10s" bSTG bV "\n",
1228*08b48e0bSAndroid Build Coastguard Worker (stab_ratio < 85 && afl->var_byte_count > 40)
1229*08b48e0bSAndroid Build Coastguard Worker ? cLRD
1230*08b48e0bSAndroid Build Coastguard Worker : ((afl->queued_variable &&
1231*08b48e0bSAndroid Build Coastguard Worker (!afl->persistent_mode || afl->var_byte_count > 20))
1232*08b48e0bSAndroid Build Coastguard Worker ? cMGN
1233*08b48e0bSAndroid Build Coastguard Worker : cRST),
1234*08b48e0bSAndroid Build Coastguard Worker tmp);
1235*08b48e0bSAndroid Build Coastguard Worker
1236*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->afl_env.afl_python_module)) {
1237*08b48e0bSAndroid Build Coastguard Worker
1238*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s/%s,",
1239*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(0), afl->stage_finds[STAGE_PYTHON]),
1240*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(1), afl->stage_cycles[STAGE_PYTHON]));
1241*08b48e0bSAndroid Build Coastguard Worker
1242*08b48e0bSAndroid Build Coastguard Worker } else {
1243*08b48e0bSAndroid Build Coastguard Worker
1244*08b48e0bSAndroid Build Coastguard Worker strcpy(tmp, "unused,");
1245*08b48e0bSAndroid Build Coastguard Worker
1246*08b48e0bSAndroid Build Coastguard Worker }
1247*08b48e0bSAndroid Build Coastguard Worker
1248*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->afl_env.afl_custom_mutator_library)) {
1249*08b48e0bSAndroid Build Coastguard Worker
1250*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, " ");
1251*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, u_stringify_int(IB(2), afl->stage_finds[STAGE_CUSTOM_MUTATOR]));
1252*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, "/");
1253*08b48e0bSAndroid Build Coastguard Worker strcat(tmp,
1254*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(3), afl->stage_cycles[STAGE_CUSTOM_MUTATOR]));
1255*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, ",");
1256*08b48e0bSAndroid Build Coastguard Worker
1257*08b48e0bSAndroid Build Coastguard Worker } else {
1258*08b48e0bSAndroid Build Coastguard Worker
1259*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, " unused,");
1260*08b48e0bSAndroid Build Coastguard Worker
1261*08b48e0bSAndroid Build Coastguard Worker }
1262*08b48e0bSAndroid Build Coastguard Worker
1263*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->shm.cmplog_mode)) {
1264*08b48e0bSAndroid Build Coastguard Worker
1265*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, " ");
1266*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, u_stringify_int(IB(4), afl->stage_finds[STAGE_COLORIZATION]));
1267*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, "/");
1268*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, u_stringify_int(IB(5), afl->stage_cycles[STAGE_COLORIZATION]));
1269*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, ", ");
1270*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, u_stringify_int(IB(6), afl->stage_finds[STAGE_ITS]));
1271*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, "/");
1272*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, u_stringify_int(IB(7), afl->stage_cycles[STAGE_ITS]));
1273*08b48e0bSAndroid Build Coastguard Worker
1274*08b48e0bSAndroid Build Coastguard Worker } else {
1275*08b48e0bSAndroid Build Coastguard Worker
1276*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, " unused, unused");
1277*08b48e0bSAndroid Build Coastguard Worker
1278*08b48e0bSAndroid Build Coastguard Worker }
1279*08b48e0bSAndroid Build Coastguard Worker
1280*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP "py/custom/rq : " cRST "%-36s " bSTG bVR bH20 bH2 bH bRB "\n",
1281*08b48e0bSAndroid Build Coastguard Worker tmp);
1282*08b48e0bSAndroid Build Coastguard Worker
1283*08b48e0bSAndroid Build Coastguard Worker if (likely(afl->disable_trim)) {
1284*08b48e0bSAndroid Build Coastguard Worker
1285*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "disabled, ");
1286*08b48e0bSAndroid Build Coastguard Worker
1287*08b48e0bSAndroid Build Coastguard Worker } else if (unlikely(!afl->bytes_trim_out)) {
1288*08b48e0bSAndroid Build Coastguard Worker
1289*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "n/a, ");
1290*08b48e0bSAndroid Build Coastguard Worker
1291*08b48e0bSAndroid Build Coastguard Worker } else {
1292*08b48e0bSAndroid Build Coastguard Worker
1293*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%0.02f%%/%s, ",
1294*08b48e0bSAndroid Build Coastguard Worker ((double)(afl->bytes_trim_in - afl->bytes_trim_out)) * 100 /
1295*08b48e0bSAndroid Build Coastguard Worker afl->bytes_trim_in,
1296*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(0), afl->trim_execs));
1297*08b48e0bSAndroid Build Coastguard Worker
1298*08b48e0bSAndroid Build Coastguard Worker }
1299*08b48e0bSAndroid Build Coastguard Worker
1300*08b48e0bSAndroid Build Coastguard Worker if (likely(afl->skip_deterministic)) {
1301*08b48e0bSAndroid Build Coastguard Worker
1302*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, "disabled");
1303*08b48e0bSAndroid Build Coastguard Worker
1304*08b48e0bSAndroid Build Coastguard Worker } else if (unlikely(!afl->blocks_eff_total)) {
1305*08b48e0bSAndroid Build Coastguard Worker
1306*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, "n/a");
1307*08b48e0bSAndroid Build Coastguard Worker
1308*08b48e0bSAndroid Build Coastguard Worker } else {
1309*08b48e0bSAndroid Build Coastguard Worker
1310*08b48e0bSAndroid Build Coastguard Worker u8 tmp2[128];
1311*08b48e0bSAndroid Build Coastguard Worker
1312*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp2, "%0.02f%%",
1313*08b48e0bSAndroid Build Coastguard Worker ((double)(afl->blocks_eff_total - afl->blocks_eff_select)) * 100 /
1314*08b48e0bSAndroid Build Coastguard Worker afl->blocks_eff_total);
1315*08b48e0bSAndroid Build Coastguard Worker
1316*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, tmp2);
1317*08b48e0bSAndroid Build Coastguard Worker
1318*08b48e0bSAndroid Build Coastguard Worker }
1319*08b48e0bSAndroid Build Coastguard Worker
1320*08b48e0bSAndroid Build Coastguard Worker // if (afl->custom_mutators_count) {
1321*08b48e0bSAndroid Build Coastguard Worker
1322*08b48e0bSAndroid Build Coastguard Worker //
1323*08b48e0bSAndroid Build Coastguard Worker // sprintf(tmp, "%s/%s",
1324*08b48e0bSAndroid Build Coastguard Worker // u_stringify_int(IB(0), afl->stage_finds[STAGE_CUSTOM_MUTATOR]),
1325*08b48e0bSAndroid Build Coastguard Worker // u_stringify_int(IB(1), afl->stage_cycles[STAGE_CUSTOM_MUTATOR]));
1326*08b48e0bSAndroid Build Coastguard Worker // SAYF(bV bSTOP " custom mut. : " cRST "%-36s " bSTG bV RESET_G1, tmp);
1327*08b48e0bSAndroid Build Coastguard Worker //
1328*08b48e0bSAndroid Build Coastguard Worker //} else {
1329*08b48e0bSAndroid Build Coastguard Worker
1330*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP " trim/eff : " cRST "%-36s " bSTG bV RESET_G1, tmp);
1331*08b48e0bSAndroid Build Coastguard Worker
1332*08b48e0bSAndroid Build Coastguard Worker //}
1333*08b48e0bSAndroid Build Coastguard Worker
1334*08b48e0bSAndroid Build Coastguard Worker /* Provide some CPU utilization stats. */
1335*08b48e0bSAndroid Build Coastguard Worker
1336*08b48e0bSAndroid Build Coastguard Worker if (afl->cpu_core_count) {
1337*08b48e0bSAndroid Build Coastguard Worker
1338*08b48e0bSAndroid Build Coastguard Worker char *spacing = SP10, snap[24] = " " cLGN "snapshot" cRST " ";
1339*08b48e0bSAndroid Build Coastguard Worker
1340*08b48e0bSAndroid Build Coastguard Worker double cur_runnable = get_runnable_processes();
1341*08b48e0bSAndroid Build Coastguard Worker u32 cur_utilization = cur_runnable * 100 / afl->cpu_core_count;
1342*08b48e0bSAndroid Build Coastguard Worker
1343*08b48e0bSAndroid Build Coastguard Worker u8 *cpu_color = cCYA;
1344*08b48e0bSAndroid Build Coastguard Worker
1345*08b48e0bSAndroid Build Coastguard Worker /* If we could still run one or more processes, use green. */
1346*08b48e0bSAndroid Build Coastguard Worker
1347*08b48e0bSAndroid Build Coastguard Worker if (afl->cpu_core_count > 1 && cur_runnable + 1 <= afl->cpu_core_count) {
1348*08b48e0bSAndroid Build Coastguard Worker
1349*08b48e0bSAndroid Build Coastguard Worker cpu_color = cLGN;
1350*08b48e0bSAndroid Build Coastguard Worker
1351*08b48e0bSAndroid Build Coastguard Worker }
1352*08b48e0bSAndroid Build Coastguard Worker
1353*08b48e0bSAndroid Build Coastguard Worker /* If we're clearly oversubscribed, use red. */
1354*08b48e0bSAndroid Build Coastguard Worker
1355*08b48e0bSAndroid Build Coastguard Worker if (!afl->no_cpu_meter_red && cur_utilization >= 150) { cpu_color = cLRD; }
1356*08b48e0bSAndroid Build Coastguard Worker
1357*08b48e0bSAndroid Build Coastguard Worker if (afl->fsrv.snapshot) { spacing = snap; }
1358*08b48e0bSAndroid Build Coastguard Worker
1359*08b48e0bSAndroid Build Coastguard Worker #ifdef HAVE_AFFINITY
1360*08b48e0bSAndroid Build Coastguard Worker
1361*08b48e0bSAndroid Build Coastguard Worker if (afl->cpu_aff >= 0) {
1362*08b48e0bSAndroid Build Coastguard Worker
1363*08b48e0bSAndroid Build Coastguard Worker SAYF("%s" cGRA "[cpu%03u:%s%3u%%" cGRA "]\r" cRST, spacing,
1364*08b48e0bSAndroid Build Coastguard Worker MIN(afl->cpu_aff, 999), cpu_color, MIN(cur_utilization, (u32)999));
1365*08b48e0bSAndroid Build Coastguard Worker
1366*08b48e0bSAndroid Build Coastguard Worker } else {
1367*08b48e0bSAndroid Build Coastguard Worker
1368*08b48e0bSAndroid Build Coastguard Worker SAYF("%s" cGRA " [cpu:%s%3u%%" cGRA "]\r" cRST, spacing, cpu_color,
1369*08b48e0bSAndroid Build Coastguard Worker MIN(cur_utilization, (u32)999));
1370*08b48e0bSAndroid Build Coastguard Worker
1371*08b48e0bSAndroid Build Coastguard Worker }
1372*08b48e0bSAndroid Build Coastguard Worker
1373*08b48e0bSAndroid Build Coastguard Worker #else
1374*08b48e0bSAndroid Build Coastguard Worker
1375*08b48e0bSAndroid Build Coastguard Worker SAYF("%s" cGRA " [cpu:%s%3u%%" cGRA "]\r" cRST, spacing, cpu_color,
1376*08b48e0bSAndroid Build Coastguard Worker MIN(cur_utilization, (u32)999));
1377*08b48e0bSAndroid Build Coastguard Worker
1378*08b48e0bSAndroid Build Coastguard Worker #endif /* ^HAVE_AFFINITY */
1379*08b48e0bSAndroid Build Coastguard Worker
1380*08b48e0bSAndroid Build Coastguard Worker } else {
1381*08b48e0bSAndroid Build Coastguard Worker
1382*08b48e0bSAndroid Build Coastguard Worker SAYF("\r");
1383*08b48e0bSAndroid Build Coastguard Worker
1384*08b48e0bSAndroid Build Coastguard Worker }
1385*08b48e0bSAndroid Build Coastguard Worker
1386*08b48e0bSAndroid Build Coastguard Worker /* Last line */
1387*08b48e0bSAndroid Build Coastguard Worker
1388*08b48e0bSAndroid Build Coastguard Worker SAYF(SET_G1 "\n" bSTG bLB bH cCYA bSTOP " strategy:" cPIN
1389*08b48e0bSAndroid Build Coastguard Worker " %s " bSTG bH10 cCYA bSTOP " state:" cPIN
1390*08b48e0bSAndroid Build Coastguard Worker " %s " bSTG bH2 bRB bSTOP cRST RESET_G1,
1391*08b48e0bSAndroid Build Coastguard Worker afl->fuzz_mode == 0 ? "explore" : "exploit", get_fuzzing_state(afl));
1392*08b48e0bSAndroid Build Coastguard Worker
1393*08b48e0bSAndroid Build Coastguard Worker #undef IB
1394*08b48e0bSAndroid Build Coastguard Worker
1395*08b48e0bSAndroid Build Coastguard Worker /* Hallelujah! */
1396*08b48e0bSAndroid Build Coastguard Worker
1397*08b48e0bSAndroid Build Coastguard Worker fflush(0);
1398*08b48e0bSAndroid Build Coastguard Worker
1399*08b48e0bSAndroid Build Coastguard Worker }
1400*08b48e0bSAndroid Build Coastguard Worker
1401*08b48e0bSAndroid Build Coastguard Worker void show_stats_pizza(afl_state_t *afl) {
1402*08b48e0bSAndroid Build Coastguard Worker
1403*08b48e0bSAndroid Build Coastguard Worker double t_byte_ratio, stab_ratio;
1404*08b48e0bSAndroid Build Coastguard Worker
1405*08b48e0bSAndroid Build Coastguard Worker u64 cur_ms;
1406*08b48e0bSAndroid Build Coastguard Worker u32 t_bytes, t_bits;
1407*08b48e0bSAndroid Build Coastguard Worker
1408*08b48e0bSAndroid Build Coastguard Worker static u8 banner[128];
1409*08b48e0bSAndroid Build Coastguard Worker u32 banner_len, banner_pad;
1410*08b48e0bSAndroid Build Coastguard Worker u8 tmp[256];
1411*08b48e0bSAndroid Build Coastguard Worker u8 time_tmp[64];
1412*08b48e0bSAndroid Build Coastguard Worker
1413*08b48e0bSAndroid Build Coastguard Worker u8 val_buf[8][STRINGIFY_VAL_SIZE_MAX];
1414*08b48e0bSAndroid Build Coastguard Worker #define IB(i) (val_buf[(i)])
1415*08b48e0bSAndroid Build Coastguard Worker
1416*08b48e0bSAndroid Build Coastguard Worker cur_ms = get_cur_time();
1417*08b48e0bSAndroid Build Coastguard Worker
1418*08b48e0bSAndroid Build Coastguard Worker if (afl->most_time_key) {
1419*08b48e0bSAndroid Build Coastguard Worker
1420*08b48e0bSAndroid Build Coastguard Worker if (afl->most_time * 1000 < cur_ms - afl->start_time) {
1421*08b48e0bSAndroid Build Coastguard Worker
1422*08b48e0bSAndroid Build Coastguard Worker afl->most_time_key = 2;
1423*08b48e0bSAndroid Build Coastguard Worker afl->stop_soon = 2;
1424*08b48e0bSAndroid Build Coastguard Worker
1425*08b48e0bSAndroid Build Coastguard Worker }
1426*08b48e0bSAndroid Build Coastguard Worker
1427*08b48e0bSAndroid Build Coastguard Worker }
1428*08b48e0bSAndroid Build Coastguard Worker
1429*08b48e0bSAndroid Build Coastguard Worker if (afl->most_execs_key == 1) {
1430*08b48e0bSAndroid Build Coastguard Worker
1431*08b48e0bSAndroid Build Coastguard Worker if (afl->most_execs <= afl->fsrv.total_execs) {
1432*08b48e0bSAndroid Build Coastguard Worker
1433*08b48e0bSAndroid Build Coastguard Worker afl->most_execs_key = 2;
1434*08b48e0bSAndroid Build Coastguard Worker afl->stop_soon = 2;
1435*08b48e0bSAndroid Build Coastguard Worker
1436*08b48e0bSAndroid Build Coastguard Worker }
1437*08b48e0bSAndroid Build Coastguard Worker
1438*08b48e0bSAndroid Build Coastguard Worker }
1439*08b48e0bSAndroid Build Coastguard Worker
1440*08b48e0bSAndroid Build Coastguard Worker /* If not enough time has passed since last UI update, bail out. */
1441*08b48e0bSAndroid Build Coastguard Worker
1442*08b48e0bSAndroid Build Coastguard Worker if (cur_ms - afl->stats_last_ms < 1000 / UI_TARGET_HZ &&
1443*08b48e0bSAndroid Build Coastguard Worker !afl->force_ui_update) {
1444*08b48e0bSAndroid Build Coastguard Worker
1445*08b48e0bSAndroid Build Coastguard Worker return;
1446*08b48e0bSAndroid Build Coastguard Worker
1447*08b48e0bSAndroid Build Coastguard Worker }
1448*08b48e0bSAndroid Build Coastguard Worker
1449*08b48e0bSAndroid Build Coastguard Worker /* Check if we're past the 10 minute mark. */
1450*08b48e0bSAndroid Build Coastguard Worker
1451*08b48e0bSAndroid Build Coastguard Worker if (cur_ms - afl->start_time > 10 * 60 * 1000) { afl->run_over10m = 1; }
1452*08b48e0bSAndroid Build Coastguard Worker
1453*08b48e0bSAndroid Build Coastguard Worker /* Calculate smoothed exec speed stats. */
1454*08b48e0bSAndroid Build Coastguard Worker
1455*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!afl->stats_last_execs)) {
1456*08b48e0bSAndroid Build Coastguard Worker
1457*08b48e0bSAndroid Build Coastguard Worker if (likely(cur_ms != afl->start_time)) {
1458*08b48e0bSAndroid Build Coastguard Worker
1459*08b48e0bSAndroid Build Coastguard Worker afl->stats_avg_exec = ((double)afl->fsrv.total_execs) * 1000 /
1460*08b48e0bSAndroid Build Coastguard Worker (afl->prev_run_time + cur_ms - afl->start_time);
1461*08b48e0bSAndroid Build Coastguard Worker
1462*08b48e0bSAndroid Build Coastguard Worker }
1463*08b48e0bSAndroid Build Coastguard Worker
1464*08b48e0bSAndroid Build Coastguard Worker } else {
1465*08b48e0bSAndroid Build Coastguard Worker
1466*08b48e0bSAndroid Build Coastguard Worker if (likely(cur_ms != afl->stats_last_ms)) {
1467*08b48e0bSAndroid Build Coastguard Worker
1468*08b48e0bSAndroid Build Coastguard Worker double cur_avg =
1469*08b48e0bSAndroid Build Coastguard Worker ((double)(afl->fsrv.total_execs - afl->stats_last_execs)) * 1000 /
1470*08b48e0bSAndroid Build Coastguard Worker (cur_ms - afl->stats_last_ms);
1471*08b48e0bSAndroid Build Coastguard Worker
1472*08b48e0bSAndroid Build Coastguard Worker /* If there is a dramatic (5x+) jump in speed, reset the indicator
1473*08b48e0bSAndroid Build Coastguard Worker more quickly. */
1474*08b48e0bSAndroid Build Coastguard Worker
1475*08b48e0bSAndroid Build Coastguard Worker if (cur_avg * 5 < afl->stats_avg_exec ||
1476*08b48e0bSAndroid Build Coastguard Worker cur_avg / 5 > afl->stats_avg_exec) {
1477*08b48e0bSAndroid Build Coastguard Worker
1478*08b48e0bSAndroid Build Coastguard Worker afl->stats_avg_exec = cur_avg;
1479*08b48e0bSAndroid Build Coastguard Worker
1480*08b48e0bSAndroid Build Coastguard Worker }
1481*08b48e0bSAndroid Build Coastguard Worker
1482*08b48e0bSAndroid Build Coastguard Worker afl->stats_avg_exec = afl->stats_avg_exec * (1.0 - 1.0 / AVG_SMOOTHING) +
1483*08b48e0bSAndroid Build Coastguard Worker cur_avg * (1.0 / AVG_SMOOTHING);
1484*08b48e0bSAndroid Build Coastguard Worker
1485*08b48e0bSAndroid Build Coastguard Worker }
1486*08b48e0bSAndroid Build Coastguard Worker
1487*08b48e0bSAndroid Build Coastguard Worker }
1488*08b48e0bSAndroid Build Coastguard Worker
1489*08b48e0bSAndroid Build Coastguard Worker afl->stats_last_ms = cur_ms;
1490*08b48e0bSAndroid Build Coastguard Worker afl->stats_last_execs = afl->fsrv.total_execs;
1491*08b48e0bSAndroid Build Coastguard Worker
1492*08b48e0bSAndroid Build Coastguard Worker /* Tell the callers when to contact us (as measured in execs). */
1493*08b48e0bSAndroid Build Coastguard Worker
1494*08b48e0bSAndroid Build Coastguard Worker afl->stats_update_freq = afl->stats_avg_exec / (UI_TARGET_HZ * 10);
1495*08b48e0bSAndroid Build Coastguard Worker if (!afl->stats_update_freq) { afl->stats_update_freq = 1; }
1496*08b48e0bSAndroid Build Coastguard Worker
1497*08b48e0bSAndroid Build Coastguard Worker /* Do some bitmap stats. */
1498*08b48e0bSAndroid Build Coastguard Worker
1499*08b48e0bSAndroid Build Coastguard Worker t_bytes = count_non_255_bytes(afl, afl->virgin_bits);
1500*08b48e0bSAndroid Build Coastguard Worker t_byte_ratio = ((double)t_bytes * 100) / afl->fsrv.real_map_size;
1501*08b48e0bSAndroid Build Coastguard Worker
1502*08b48e0bSAndroid Build Coastguard Worker if (unlikely(t_bytes > afl->fsrv.real_map_size)) {
1503*08b48e0bSAndroid Build Coastguard Worker
1504*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!afl->afl_env.afl_ignore_problems)) {
1505*08b48e0bSAndroid Build Coastguard Worker
1506*08b48e0bSAndroid Build Coastguard Worker FATAL(
1507*08b48e0bSAndroid Build Coastguard Worker "This is what happens when you speak italian to the rabbit "
1508*08b48e0bSAndroid Build Coastguard Worker "Don't speak italian to the rabbit");
1509*08b48e0bSAndroid Build Coastguard Worker
1510*08b48e0bSAndroid Build Coastguard Worker }
1511*08b48e0bSAndroid Build Coastguard Worker
1512*08b48e0bSAndroid Build Coastguard Worker }
1513*08b48e0bSAndroid Build Coastguard Worker
1514*08b48e0bSAndroid Build Coastguard Worker if (likely(t_bytes) && unlikely(afl->var_byte_count)) {
1515*08b48e0bSAndroid Build Coastguard Worker
1516*08b48e0bSAndroid Build Coastguard Worker stab_ratio = 100 - (((double)afl->var_byte_count * 100) / t_bytes);
1517*08b48e0bSAndroid Build Coastguard Worker
1518*08b48e0bSAndroid Build Coastguard Worker } else {
1519*08b48e0bSAndroid Build Coastguard Worker
1520*08b48e0bSAndroid Build Coastguard Worker stab_ratio = 100;
1521*08b48e0bSAndroid Build Coastguard Worker
1522*08b48e0bSAndroid Build Coastguard Worker }
1523*08b48e0bSAndroid Build Coastguard Worker
1524*08b48e0bSAndroid Build Coastguard Worker /* Roughly every minute, update fuzzer stats and save auto tokens. */
1525*08b48e0bSAndroid Build Coastguard Worker
1526*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!afl->non_instrumented_mode &&
1527*08b48e0bSAndroid Build Coastguard Worker (afl->force_ui_update ||
1528*08b48e0bSAndroid Build Coastguard Worker cur_ms - afl->stats_last_stats_ms > STATS_UPDATE_SEC * 1000))) {
1529*08b48e0bSAndroid Build Coastguard Worker
1530*08b48e0bSAndroid Build Coastguard Worker afl->stats_last_stats_ms = cur_ms;
1531*08b48e0bSAndroid Build Coastguard Worker write_stats_file(afl, t_bytes, t_byte_ratio, stab_ratio,
1532*08b48e0bSAndroid Build Coastguard Worker afl->stats_avg_exec);
1533*08b48e0bSAndroid Build Coastguard Worker save_auto(afl);
1534*08b48e0bSAndroid Build Coastguard Worker write_bitmap(afl);
1535*08b48e0bSAndroid Build Coastguard Worker
1536*08b48e0bSAndroid Build Coastguard Worker }
1537*08b48e0bSAndroid Build Coastguard Worker
1538*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->afl_env.afl_statsd)) {
1539*08b48e0bSAndroid Build Coastguard Worker
1540*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->force_ui_update || cur_ms - afl->statsd_last_send_ms >
1541*08b48e0bSAndroid Build Coastguard Worker STATSD_UPDATE_SEC * 1000)) {
1542*08b48e0bSAndroid Build Coastguard Worker
1543*08b48e0bSAndroid Build Coastguard Worker /* reset counter, even if send failed. */
1544*08b48e0bSAndroid Build Coastguard Worker afl->statsd_last_send_ms = cur_ms;
1545*08b48e0bSAndroid Build Coastguard Worker if (statsd_send_metric(afl)) {
1546*08b48e0bSAndroid Build Coastguard Worker
1547*08b48e0bSAndroid Build Coastguard Worker WARNF("Could not order tomato sauce from statsd.");
1548*08b48e0bSAndroid Build Coastguard Worker
1549*08b48e0bSAndroid Build Coastguard Worker }
1550*08b48e0bSAndroid Build Coastguard Worker
1551*08b48e0bSAndroid Build Coastguard Worker }
1552*08b48e0bSAndroid Build Coastguard Worker
1553*08b48e0bSAndroid Build Coastguard Worker }
1554*08b48e0bSAndroid Build Coastguard Worker
1555*08b48e0bSAndroid Build Coastguard Worker /* Every now and then, write plot data. */
1556*08b48e0bSAndroid Build Coastguard Worker
1557*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->force_ui_update ||
1558*08b48e0bSAndroid Build Coastguard Worker cur_ms - afl->stats_last_plot_ms > PLOT_UPDATE_SEC * 1000)) {
1559*08b48e0bSAndroid Build Coastguard Worker
1560*08b48e0bSAndroid Build Coastguard Worker afl->stats_last_plot_ms = cur_ms;
1561*08b48e0bSAndroid Build Coastguard Worker maybe_update_plot_file(afl, t_bytes, t_byte_ratio, afl->stats_avg_exec);
1562*08b48e0bSAndroid Build Coastguard Worker
1563*08b48e0bSAndroid Build Coastguard Worker }
1564*08b48e0bSAndroid Build Coastguard Worker
1565*08b48e0bSAndroid Build Coastguard Worker /* Every now and then, write queue data. */
1566*08b48e0bSAndroid Build Coastguard Worker
1567*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->force_ui_update ||
1568*08b48e0bSAndroid Build Coastguard Worker cur_ms - afl->stats_last_queue_ms > QUEUE_UPDATE_SEC * 1000)) {
1569*08b48e0bSAndroid Build Coastguard Worker
1570*08b48e0bSAndroid Build Coastguard Worker afl->stats_last_queue_ms = cur_ms;
1571*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
1572*08b48e0bSAndroid Build Coastguard Worker write_queue_stats(afl);
1573*08b48e0bSAndroid Build Coastguard Worker #endif
1574*08b48e0bSAndroid Build Coastguard Worker
1575*08b48e0bSAndroid Build Coastguard Worker }
1576*08b48e0bSAndroid Build Coastguard Worker
1577*08b48e0bSAndroid Build Coastguard Worker /* Honor AFL_EXIT_WHEN_DONE and AFL_BENCH_UNTIL_CRASH. */
1578*08b48e0bSAndroid Build Coastguard Worker
1579*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!afl->non_instrumented_mode && afl->cycles_wo_finds > 100 &&
1580*08b48e0bSAndroid Build Coastguard Worker !afl->pending_not_fuzzed && afl->afl_env.afl_exit_when_done)) {
1581*08b48e0bSAndroid Build Coastguard Worker
1582*08b48e0bSAndroid Build Coastguard Worker afl->stop_soon = 2;
1583*08b48e0bSAndroid Build Coastguard Worker
1584*08b48e0bSAndroid Build Coastguard Worker }
1585*08b48e0bSAndroid Build Coastguard Worker
1586*08b48e0bSAndroid Build Coastguard Worker /* AFL_EXIT_ON_TIME. */
1587*08b48e0bSAndroid Build Coastguard Worker
1588*08b48e0bSAndroid Build Coastguard Worker /* If no coverage was found yet, check whether run time is greater than
1589*08b48e0bSAndroid Build Coastguard Worker * exit_on_time. */
1590*08b48e0bSAndroid Build Coastguard Worker
1591*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!afl->non_instrumented_mode && afl->afl_env.afl_exit_on_time &&
1592*08b48e0bSAndroid Build Coastguard Worker ((afl->last_find_time &&
1593*08b48e0bSAndroid Build Coastguard Worker (cur_ms - afl->last_find_time) > afl->exit_on_time) ||
1594*08b48e0bSAndroid Build Coastguard Worker (!afl->last_find_time &&
1595*08b48e0bSAndroid Build Coastguard Worker (cur_ms - afl->start_time) > afl->exit_on_time)))) {
1596*08b48e0bSAndroid Build Coastguard Worker
1597*08b48e0bSAndroid Build Coastguard Worker afl->stop_soon = 2;
1598*08b48e0bSAndroid Build Coastguard Worker
1599*08b48e0bSAndroid Build Coastguard Worker }
1600*08b48e0bSAndroid Build Coastguard Worker
1601*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->total_crashes && afl->afl_env.afl_bench_until_crash)) {
1602*08b48e0bSAndroid Build Coastguard Worker
1603*08b48e0bSAndroid Build Coastguard Worker afl->stop_soon = 2;
1604*08b48e0bSAndroid Build Coastguard Worker
1605*08b48e0bSAndroid Build Coastguard Worker }
1606*08b48e0bSAndroid Build Coastguard Worker
1607*08b48e0bSAndroid Build Coastguard Worker /* If we're not on TTY, bail out. */
1608*08b48e0bSAndroid Build Coastguard Worker
1609*08b48e0bSAndroid Build Coastguard Worker if (afl->not_on_tty) { return; }
1610*08b48e0bSAndroid Build Coastguard Worker
1611*08b48e0bSAndroid Build Coastguard Worker /* If we haven't started doing things, bail out. */
1612*08b48e0bSAndroid Build Coastguard Worker
1613*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!afl->queue_cur)) { return; }
1614*08b48e0bSAndroid Build Coastguard Worker
1615*08b48e0bSAndroid Build Coastguard Worker /* Compute some mildly useful bitmap stats. */
1616*08b48e0bSAndroid Build Coastguard Worker
1617*08b48e0bSAndroid Build Coastguard Worker t_bits = (afl->fsrv.map_size << 3) - count_bits(afl, afl->virgin_bits);
1618*08b48e0bSAndroid Build Coastguard Worker
1619*08b48e0bSAndroid Build Coastguard Worker /* Now, for the visuals... */
1620*08b48e0bSAndroid Build Coastguard Worker
1621*08b48e0bSAndroid Build Coastguard Worker if (afl->clear_screen) {
1622*08b48e0bSAndroid Build Coastguard Worker
1623*08b48e0bSAndroid Build Coastguard Worker SAYF(TERM_CLEAR CURSOR_HIDE);
1624*08b48e0bSAndroid Build Coastguard Worker afl->clear_screen = 0;
1625*08b48e0bSAndroid Build Coastguard Worker
1626*08b48e0bSAndroid Build Coastguard Worker check_term_size(afl);
1627*08b48e0bSAndroid Build Coastguard Worker
1628*08b48e0bSAndroid Build Coastguard Worker }
1629*08b48e0bSAndroid Build Coastguard Worker
1630*08b48e0bSAndroid Build Coastguard Worker SAYF(TERM_HOME);
1631*08b48e0bSAndroid Build Coastguard Worker
1632*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->term_too_small)) {
1633*08b48e0bSAndroid Build Coastguard Worker
1634*08b48e0bSAndroid Build Coastguard Worker SAYF(cBRI
1635*08b48e0bSAndroid Build Coastguard Worker "Our pizzeria can't host this many guests.\n"
1636*08b48e0bSAndroid Build Coastguard Worker "Please call Pizzeria Caravaggio. They have tables of at least "
1637*08b48e0bSAndroid Build Coastguard Worker "79x24.\n" cRST);
1638*08b48e0bSAndroid Build Coastguard Worker
1639*08b48e0bSAndroid Build Coastguard Worker return;
1640*08b48e0bSAndroid Build Coastguard Worker
1641*08b48e0bSAndroid Build Coastguard Worker }
1642*08b48e0bSAndroid Build Coastguard Worker
1643*08b48e0bSAndroid Build Coastguard Worker /* Let's start by drawing a centered banner. */
1644*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!banner[0])) {
1645*08b48e0bSAndroid Build Coastguard Worker
1646*08b48e0bSAndroid Build Coastguard Worker char *si = "";
1647*08b48e0bSAndroid Build Coastguard Worker if (afl->sync_id) { si = afl->sync_id; }
1648*08b48e0bSAndroid Build Coastguard Worker memset(banner, 0, sizeof(banner));
1649*08b48e0bSAndroid Build Coastguard Worker banner_len = (afl->crash_mode ? 20 : 18) + strlen(VERSION) + strlen(si) +
1650*08b48e0bSAndroid Build Coastguard Worker strlen(afl->power_name) + 4 + 6;
1651*08b48e0bSAndroid Build Coastguard Worker
1652*08b48e0bSAndroid Build Coastguard Worker if (strlen(afl->use_banner) + banner_len > 75) {
1653*08b48e0bSAndroid Build Coastguard Worker
1654*08b48e0bSAndroid Build Coastguard Worker afl->use_banner += (strlen(afl->use_banner) + banner_len) - 76;
1655*08b48e0bSAndroid Build Coastguard Worker memset(afl->use_banner, '.', 3);
1656*08b48e0bSAndroid Build Coastguard Worker
1657*08b48e0bSAndroid Build Coastguard Worker }
1658*08b48e0bSAndroid Build Coastguard Worker
1659*08b48e0bSAndroid Build Coastguard Worker banner_len += strlen(afl->use_banner);
1660*08b48e0bSAndroid Build Coastguard Worker banner_pad = (79 - banner_len) / 2;
1661*08b48e0bSAndroid Build Coastguard Worker memset(banner, ' ', banner_pad);
1662*08b48e0bSAndroid Build Coastguard Worker
1663*08b48e0bSAndroid Build Coastguard Worker #ifdef __linux__
1664*08b48e0bSAndroid Build Coastguard Worker if (afl->fsrv.nyx_mode) {
1665*08b48e0bSAndroid Build Coastguard Worker
1666*08b48e0bSAndroid Build Coastguard Worker snprintf(banner + banner_pad, sizeof(banner) - banner_pad,
1667*08b48e0bSAndroid Build Coastguard Worker "%s " cLCY VERSION cLBL " {%s} " cLGN "(%s) " cPIN "[%s] - Nyx",
1668*08b48e0bSAndroid Build Coastguard Worker afl->crash_mode ? cPIN
1669*08b48e0bSAndroid Build Coastguard Worker "Mozzarbella Pizzeria table booking system"
1670*08b48e0bSAndroid Build Coastguard Worker : cYEL "Mozzarbella Pizzeria management system",
1671*08b48e0bSAndroid Build Coastguard Worker si, afl->use_banner, afl->power_name);
1672*08b48e0bSAndroid Build Coastguard Worker
1673*08b48e0bSAndroid Build Coastguard Worker } else {
1674*08b48e0bSAndroid Build Coastguard Worker
1675*08b48e0bSAndroid Build Coastguard Worker #endif
1676*08b48e0bSAndroid Build Coastguard Worker snprintf(banner + banner_pad, sizeof(banner) - banner_pad,
1677*08b48e0bSAndroid Build Coastguard Worker "%s " cLCY VERSION cLBL " {%s} " cLGN "(%s) " cPIN "[%s]",
1678*08b48e0bSAndroid Build Coastguard Worker afl->crash_mode ? cPIN
1679*08b48e0bSAndroid Build Coastguard Worker "Mozzarbella Pizzeria table booking system"
1680*08b48e0bSAndroid Build Coastguard Worker : cYEL "Mozzarbella Pizzeria management system",
1681*08b48e0bSAndroid Build Coastguard Worker si, afl->use_banner, afl->power_name);
1682*08b48e0bSAndroid Build Coastguard Worker
1683*08b48e0bSAndroid Build Coastguard Worker #ifdef __linux__
1684*08b48e0bSAndroid Build Coastguard Worker
1685*08b48e0bSAndroid Build Coastguard Worker }
1686*08b48e0bSAndroid Build Coastguard Worker
1687*08b48e0bSAndroid Build Coastguard Worker #endif
1688*08b48e0bSAndroid Build Coastguard Worker
1689*08b48e0bSAndroid Build Coastguard Worker }
1690*08b48e0bSAndroid Build Coastguard Worker
1691*08b48e0bSAndroid Build Coastguard Worker SAYF("\n%s\n", banner);
1692*08b48e0bSAndroid Build Coastguard Worker
1693*08b48e0bSAndroid Build Coastguard Worker /* "Handy" shortcuts for drawing boxes... */
1694*08b48e0bSAndroid Build Coastguard Worker
1695*08b48e0bSAndroid Build Coastguard Worker #define bSTG bSTART cGRA
1696*08b48e0bSAndroid Build Coastguard Worker #define bH2 bH bH
1697*08b48e0bSAndroid Build Coastguard Worker #define bH5 bH2 bH2 bH
1698*08b48e0bSAndroid Build Coastguard Worker #define bH10 bH5 bH5
1699*08b48e0bSAndroid Build Coastguard Worker #define bH20 bH10 bH10
1700*08b48e0bSAndroid Build Coastguard Worker #define bH30 bH20 bH10
1701*08b48e0bSAndroid Build Coastguard Worker #define SP5 " "
1702*08b48e0bSAndroid Build Coastguard Worker #define SP10 SP5 SP5
1703*08b48e0bSAndroid Build Coastguard Worker #define SP20 SP10 SP10
1704*08b48e0bSAndroid Build Coastguard Worker
1705*08b48e0bSAndroid Build Coastguard Worker /* Since `total_crashes` does not get reloaded from disk on restart,
1706*08b48e0bSAndroid Build Coastguard Worker it indicates if we found crashes this round already -> paint red.
1707*08b48e0bSAndroid Build Coastguard Worker If it's 0, but `saved_crashes` is set from a past run, paint in yellow. */
1708*08b48e0bSAndroid Build Coastguard Worker char *crash_color = afl->total_crashes ? cLRD
1709*08b48e0bSAndroid Build Coastguard Worker : afl->saved_crashes ? cYEL
1710*08b48e0bSAndroid Build Coastguard Worker : cRST;
1711*08b48e0bSAndroid Build Coastguard Worker
1712*08b48e0bSAndroid Build Coastguard Worker /* Lord, forgive me this. */
1713*08b48e0bSAndroid Build Coastguard Worker
1714*08b48e0bSAndroid Build Coastguard Worker SAYF(SET_G1 bSTG bLT bH bSTOP cCYA
1715*08b48e0bSAndroid Build Coastguard Worker " Mozzarbella has been proudly serving pizzas since " bSTG bH20 bH bH bH
1716*08b48e0bSAndroid Build Coastguard Worker bHB bH bSTOP cCYA " In this time, we served " bSTG bH30 bRT "\n");
1717*08b48e0bSAndroid Build Coastguard Worker
1718*08b48e0bSAndroid Build Coastguard Worker if (afl->non_instrumented_mode) {
1719*08b48e0bSAndroid Build Coastguard Worker
1720*08b48e0bSAndroid Build Coastguard Worker strcpy(tmp, cRST);
1721*08b48e0bSAndroid Build Coastguard Worker
1722*08b48e0bSAndroid Build Coastguard Worker } else {
1723*08b48e0bSAndroid Build Coastguard Worker
1724*08b48e0bSAndroid Build Coastguard Worker u64 min_wo_finds = (cur_ms - afl->last_find_time) / 1000 / 60;
1725*08b48e0bSAndroid Build Coastguard Worker
1726*08b48e0bSAndroid Build Coastguard Worker /* First queue cycle: don't stop now! */
1727*08b48e0bSAndroid Build Coastguard Worker if (afl->queue_cycle == 1 || min_wo_finds < 15) {
1728*08b48e0bSAndroid Build Coastguard Worker
1729*08b48e0bSAndroid Build Coastguard Worker strcpy(tmp, cMGN);
1730*08b48e0bSAndroid Build Coastguard Worker
1731*08b48e0bSAndroid Build Coastguard Worker } else
1732*08b48e0bSAndroid Build Coastguard Worker
1733*08b48e0bSAndroid Build Coastguard Worker /* Subsequent cycles, but we're still making finds. */
1734*08b48e0bSAndroid Build Coastguard Worker if (afl->cycles_wo_finds < 25 || min_wo_finds < 30) {
1735*08b48e0bSAndroid Build Coastguard Worker
1736*08b48e0bSAndroid Build Coastguard Worker strcpy(tmp, cYEL);
1737*08b48e0bSAndroid Build Coastguard Worker
1738*08b48e0bSAndroid Build Coastguard Worker } else
1739*08b48e0bSAndroid Build Coastguard Worker
1740*08b48e0bSAndroid Build Coastguard Worker /* No finds for a long time and no test cases to try. */
1741*08b48e0bSAndroid Build Coastguard Worker if (afl->cycles_wo_finds > 100 && !afl->pending_not_fuzzed &&
1742*08b48e0bSAndroid Build Coastguard Worker min_wo_finds > 120) {
1743*08b48e0bSAndroid Build Coastguard Worker
1744*08b48e0bSAndroid Build Coastguard Worker strcpy(tmp, cLGN);
1745*08b48e0bSAndroid Build Coastguard Worker
1746*08b48e0bSAndroid Build Coastguard Worker /* Default: cautiously OK to stop? */
1747*08b48e0bSAndroid Build Coastguard Worker
1748*08b48e0bSAndroid Build Coastguard Worker } else {
1749*08b48e0bSAndroid Build Coastguard Worker
1750*08b48e0bSAndroid Build Coastguard Worker strcpy(tmp, cLBL);
1751*08b48e0bSAndroid Build Coastguard Worker
1752*08b48e0bSAndroid Build Coastguard Worker }
1753*08b48e0bSAndroid Build Coastguard Worker
1754*08b48e0bSAndroid Build Coastguard Worker }
1755*08b48e0bSAndroid Build Coastguard Worker
1756*08b48e0bSAndroid Build Coastguard Worker u_stringify_time_diff(time_tmp, afl->prev_run_time + cur_ms, afl->start_time);
1757*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP
1758*08b48e0bSAndroid Build Coastguard Worker " open time : " cRST "%-37s " bSTG bV bSTOP
1759*08b48e0bSAndroid Build Coastguard Worker " seasons done : %s%-5s " bSTG bV "\n",
1760*08b48e0bSAndroid Build Coastguard Worker time_tmp, tmp, u_stringify_int(IB(0), afl->queue_cycle - 1));
1761*08b48e0bSAndroid Build Coastguard Worker
1762*08b48e0bSAndroid Build Coastguard Worker /* We want to warn people about not seeing new paths after a full cycle,
1763*08b48e0bSAndroid Build Coastguard Worker except when resuming fuzzing or running in non-instrumented mode. */
1764*08b48e0bSAndroid Build Coastguard Worker
1765*08b48e0bSAndroid Build Coastguard Worker if (!afl->non_instrumented_mode &&
1766*08b48e0bSAndroid Build Coastguard Worker (afl->last_find_time || afl->resuming_fuzz || afl->queue_cycle == 1 ||
1767*08b48e0bSAndroid Build Coastguard Worker afl->in_bitmap || afl->crash_mode)) {
1768*08b48e0bSAndroid Build Coastguard Worker
1769*08b48e0bSAndroid Build Coastguard Worker u_stringify_time_diff(time_tmp, cur_ms, afl->last_find_time);
1770*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP " last pizza baked : " cRST "%-37s ",
1771*08b48e0bSAndroid Build Coastguard Worker time_tmp);
1772*08b48e0bSAndroid Build Coastguard Worker
1773*08b48e0bSAndroid Build Coastguard Worker } else {
1774*08b48e0bSAndroid Build Coastguard Worker
1775*08b48e0bSAndroid Build Coastguard Worker if (afl->non_instrumented_mode) {
1776*08b48e0bSAndroid Build Coastguard Worker
1777*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP " last pizza baked : " cPIN "n/a" cRST
1778*08b48e0bSAndroid Build Coastguard Worker " (non-instrumented mode) ");
1779*08b48e0bSAndroid Build Coastguard Worker
1780*08b48e0bSAndroid Build Coastguard Worker } else {
1781*08b48e0bSAndroid Build Coastguard Worker
1782*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP " last pizza baked : " cRST
1783*08b48e0bSAndroid Build Coastguard Worker "none yet " cLRD
1784*08b48e0bSAndroid Build Coastguard Worker "(odd, check Gennarino, he might be slacking!) ");
1785*08b48e0bSAndroid Build Coastguard Worker
1786*08b48e0bSAndroid Build Coastguard Worker }
1787*08b48e0bSAndroid Build Coastguard Worker
1788*08b48e0bSAndroid Build Coastguard Worker }
1789*08b48e0bSAndroid Build Coastguard Worker
1790*08b48e0bSAndroid Build Coastguard Worker SAYF(bSTG bV bSTOP " pizzas on the menu : " cRST
1791*08b48e0bSAndroid Build Coastguard Worker "%-5s " bSTG bV "\n",
1792*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(0), afl->queued_items));
1793*08b48e0bSAndroid Build Coastguard Worker
1794*08b48e0bSAndroid Build Coastguard Worker /* Highlight crashes in red if found, denote going over the KEEP_UNIQUE_CRASH
1795*08b48e0bSAndroid Build Coastguard Worker limit with a '+' appended to the count. */
1796*08b48e0bSAndroid Build Coastguard Worker
1797*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s%s", u_stringify_int(IB(0), afl->saved_crashes),
1798*08b48e0bSAndroid Build Coastguard Worker (afl->saved_crashes >= KEEP_UNIQUE_CRASH) ? "+" : "");
1799*08b48e0bSAndroid Build Coastguard Worker
1800*08b48e0bSAndroid Build Coastguard Worker u_stringify_time_diff(time_tmp, cur_ms, afl->last_crash_time);
1801*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP
1802*08b48e0bSAndroid Build Coastguard Worker " last ordered pizza : " cRST "%-33s " bSTG bV bSTOP
1803*08b48e0bSAndroid Build Coastguard Worker " at table : %s%-6s " bSTG bV "\n",
1804*08b48e0bSAndroid Build Coastguard Worker time_tmp, crash_color, tmp);
1805*08b48e0bSAndroid Build Coastguard Worker
1806*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s%s", u_stringify_int(IB(0), afl->saved_hangs),
1807*08b48e0bSAndroid Build Coastguard Worker (afl->saved_hangs >= KEEP_UNIQUE_HANG) ? "+" : "");
1808*08b48e0bSAndroid Build Coastguard Worker
1809*08b48e0bSAndroid Build Coastguard Worker u_stringify_time_diff(time_tmp, cur_ms, afl->last_hang_time);
1810*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP
1811*08b48e0bSAndroid Build Coastguard Worker " last conversation with customers : " cRST "%-33s " bSTG bV bSTOP
1812*08b48e0bSAndroid Build Coastguard Worker " number of Peroni : " cRST "%-6s " bSTG bV
1813*08b48e0bSAndroid Build Coastguard Worker "\n",
1814*08b48e0bSAndroid Build Coastguard Worker time_tmp, tmp);
1815*08b48e0bSAndroid Build Coastguard Worker
1816*08b48e0bSAndroid Build Coastguard Worker SAYF(bVR bH bSTOP cCYA
1817*08b48e0bSAndroid Build Coastguard Worker " Baking progress " bSTG bH30 bH20 bH5 bH bX bH bSTOP cCYA
1818*08b48e0bSAndroid Build Coastguard Worker " Pizzeria busyness" bSTG bH30 bH5 bH bH bVL "\n");
1819*08b48e0bSAndroid Build Coastguard Worker
1820*08b48e0bSAndroid Build Coastguard Worker /* This gets funny because we want to print several variable-length variables
1821*08b48e0bSAndroid Build Coastguard Worker together, but then cram them into a fixed-width field - so we need to
1822*08b48e0bSAndroid Build Coastguard Worker put them in a temporary buffer first. */
1823*08b48e0bSAndroid Build Coastguard Worker
1824*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s%s%u (%0.01f%%)", u_stringify_int(IB(0), afl->current_entry),
1825*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->favored ? "." : "*", afl->queue_cur->fuzz_level,
1826*08b48e0bSAndroid Build Coastguard Worker ((double)afl->current_entry * 100) / afl->queued_items);
1827*08b48e0bSAndroid Build Coastguard Worker
1828*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP " now baking : " cRST
1829*08b48e0bSAndroid Build Coastguard Worker "%-18s " bSTG bV bSTOP,
1830*08b48e0bSAndroid Build Coastguard Worker tmp);
1831*08b48e0bSAndroid Build Coastguard Worker
1832*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%0.02f%% / %0.02f%%",
1833*08b48e0bSAndroid Build Coastguard Worker ((double)afl->queue_cur->bitmap_size) * 100 / afl->fsrv.real_map_size,
1834*08b48e0bSAndroid Build Coastguard Worker t_byte_ratio);
1835*08b48e0bSAndroid Build Coastguard Worker
1836*08b48e0bSAndroid Build Coastguard Worker SAYF(" table full : %s%-19s " bSTG bV "\n",
1837*08b48e0bSAndroid Build Coastguard Worker t_byte_ratio > 70
1838*08b48e0bSAndroid Build Coastguard Worker ? cLRD
1839*08b48e0bSAndroid Build Coastguard Worker : ((t_bytes < 200 && !afl->non_instrumented_mode) ? cPIN : cRST),
1840*08b48e0bSAndroid Build Coastguard Worker tmp);
1841*08b48e0bSAndroid Build Coastguard Worker
1842*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s (%0.02f%%)", u_stringify_int(IB(0), afl->cur_skipped_items),
1843*08b48e0bSAndroid Build Coastguard Worker ((double)afl->cur_skipped_items * 100) / afl->queued_items);
1844*08b48e0bSAndroid Build Coastguard Worker
1845*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP " burned pizzas : " cRST
1846*08b48e0bSAndroid Build Coastguard Worker "%-18s " bSTG bV,
1847*08b48e0bSAndroid Build Coastguard Worker tmp);
1848*08b48e0bSAndroid Build Coastguard Worker
1849*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%0.02f bits/tuple", t_bytes ? (((double)t_bits) / t_bytes) : 0);
1850*08b48e0bSAndroid Build Coastguard Worker
1851*08b48e0bSAndroid Build Coastguard Worker SAYF(bSTOP " count coverage : " cRST "%-19s " bSTG bV "\n",
1852*08b48e0bSAndroid Build Coastguard Worker tmp);
1853*08b48e0bSAndroid Build Coastguard Worker
1854*08b48e0bSAndroid Build Coastguard Worker SAYF(bVR bH bSTOP cCYA
1855*08b48e0bSAndroid Build Coastguard Worker " Pizzas almost ready " bSTG bH30 bH20 bH2 bH bX bH bSTOP cCYA
1856*08b48e0bSAndroid Build Coastguard Worker " Types of pizzas cooking " bSTG bH10 bH5 bH2 bH10 bH2 bH bVL "\n");
1857*08b48e0bSAndroid Build Coastguard Worker
1858*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s (%0.02f%%)", u_stringify_int(IB(0), afl->queued_favored),
1859*08b48e0bSAndroid Build Coastguard Worker ((double)afl->queued_favored) * 100 / afl->queued_items);
1860*08b48e0bSAndroid Build Coastguard Worker
1861*08b48e0bSAndroid Build Coastguard Worker /* Yeah... it's still going on... halp? */
1862*08b48e0bSAndroid Build Coastguard Worker
1863*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP " now preparing : " cRST
1864*08b48e0bSAndroid Build Coastguard Worker "%-22s " bSTG bV bSTOP
1865*08b48e0bSAndroid Build Coastguard Worker " favourite topping : " cRST "%-20s" bSTG bV
1866*08b48e0bSAndroid Build Coastguard Worker "\n",
1867*08b48e0bSAndroid Build Coastguard Worker afl->stage_name, tmp);
1868*08b48e0bSAndroid Build Coastguard Worker
1869*08b48e0bSAndroid Build Coastguard Worker if (!afl->stage_max) {
1870*08b48e0bSAndroid Build Coastguard Worker
1871*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s/-", u_stringify_int(IB(0), afl->stage_cur));
1872*08b48e0bSAndroid Build Coastguard Worker
1873*08b48e0bSAndroid Build Coastguard Worker } else {
1874*08b48e0bSAndroid Build Coastguard Worker
1875*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s/%s (%0.02f%%)", u_stringify_int(IB(0), afl->stage_cur),
1876*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(1), afl->stage_max),
1877*08b48e0bSAndroid Build Coastguard Worker ((double)afl->stage_cur) * 100 / afl->stage_max);
1878*08b48e0bSAndroid Build Coastguard Worker
1879*08b48e0bSAndroid Build Coastguard Worker }
1880*08b48e0bSAndroid Build Coastguard Worker
1881*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP " number of pizzas : " cRST
1882*08b48e0bSAndroid Build Coastguard Worker "%-23s " bSTG bV bSTOP,
1883*08b48e0bSAndroid Build Coastguard Worker tmp);
1884*08b48e0bSAndroid Build Coastguard Worker
1885*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s (%0.02f%%)", u_stringify_int(IB(0), afl->queued_with_cov),
1886*08b48e0bSAndroid Build Coastguard Worker ((double)afl->queued_with_cov) * 100 / afl->queued_items);
1887*08b48e0bSAndroid Build Coastguard Worker
1888*08b48e0bSAndroid Build Coastguard Worker SAYF(" new pizza type seen on Instagram : " cRST "%-20s" bSTG bV "\n", tmp);
1889*08b48e0bSAndroid Build Coastguard Worker
1890*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s (%s%s saved)", u_stringify_int(IB(0), afl->total_crashes),
1891*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(1), afl->saved_crashes),
1892*08b48e0bSAndroid Build Coastguard Worker (afl->saved_crashes >= KEEP_UNIQUE_CRASH) ? "+" : "");
1893*08b48e0bSAndroid Build Coastguard Worker
1894*08b48e0bSAndroid Build Coastguard Worker if (afl->crash_mode) {
1895*08b48e0bSAndroid Build Coastguard Worker
1896*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP " total pizzas : " cRST
1897*08b48e0bSAndroid Build Coastguard Worker "%-22s " bSTG bV bSTOP
1898*08b48e0bSAndroid Build Coastguard Worker " pizzas with pineapple : %s%-20s" bSTG bV "\n",
1899*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(0), afl->fsrv.total_execs), crash_color, tmp);
1900*08b48e0bSAndroid Build Coastguard Worker
1901*08b48e0bSAndroid Build Coastguard Worker } else {
1902*08b48e0bSAndroid Build Coastguard Worker
1903*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP " total pizzas : " cRST
1904*08b48e0bSAndroid Build Coastguard Worker "%-22s " bSTG bV bSTOP
1905*08b48e0bSAndroid Build Coastguard Worker " total pizzas with pineapple : %s%-20s" bSTG bV "\n",
1906*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(0), afl->fsrv.total_execs), crash_color, tmp);
1907*08b48e0bSAndroid Build Coastguard Worker
1908*08b48e0bSAndroid Build Coastguard Worker }
1909*08b48e0bSAndroid Build Coastguard Worker
1910*08b48e0bSAndroid Build Coastguard Worker /* Show a warning about slow execution. */
1911*08b48e0bSAndroid Build Coastguard Worker
1912*08b48e0bSAndroid Build Coastguard Worker if (afl->stats_avg_exec < 20) {
1913*08b48e0bSAndroid Build Coastguard Worker
1914*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s/sec (%s)", u_stringify_float(IB(0), afl->stats_avg_exec),
1915*08b48e0bSAndroid Build Coastguard Worker "zzzz...");
1916*08b48e0bSAndroid Build Coastguard Worker
1917*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP " pizza making speed : " cLRD
1918*08b48e0bSAndroid Build Coastguard Worker "%-22s ",
1919*08b48e0bSAndroid Build Coastguard Worker tmp);
1920*08b48e0bSAndroid Build Coastguard Worker
1921*08b48e0bSAndroid Build Coastguard Worker } else {
1922*08b48e0bSAndroid Build Coastguard Worker
1923*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s/sec", u_stringify_float(IB(0), afl->stats_avg_exec));
1924*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP " pizza making speed : " cRST
1925*08b48e0bSAndroid Build Coastguard Worker "%-22s ",
1926*08b48e0bSAndroid Build Coastguard Worker tmp);
1927*08b48e0bSAndroid Build Coastguard Worker
1928*08b48e0bSAndroid Build Coastguard Worker }
1929*08b48e0bSAndroid Build Coastguard Worker
1930*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s (%s%s saved)", u_stringify_int(IB(0), afl->total_tmouts),
1931*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(1), afl->saved_tmouts),
1932*08b48e0bSAndroid Build Coastguard Worker (afl->saved_tmouts >= KEEP_UNIQUE_HANG) ? "+" : "");
1933*08b48e0bSAndroid Build Coastguard Worker
1934*08b48e0bSAndroid Build Coastguard Worker SAYF(bSTG bV bSTOP " burned pizzas : " cRST "%-20s" bSTG bV
1935*08b48e0bSAndroid Build Coastguard Worker "\n",
1936*08b48e0bSAndroid Build Coastguard Worker tmp);
1937*08b48e0bSAndroid Build Coastguard Worker
1938*08b48e0bSAndroid Build Coastguard Worker /* Aaaalmost there... hold on! */
1939*08b48e0bSAndroid Build Coastguard Worker
1940*08b48e0bSAndroid Build Coastguard Worker SAYF(bVR bH cCYA bSTOP " Promotional campaign on TikTok yields " bSTG bH30 bH2
1941*08b48e0bSAndroid Build Coastguard Worker bH bH2 bX bH bSTOP cCYA
1942*08b48e0bSAndroid Build Coastguard Worker " Customer type " bSTG bH5 bH2 bH30 bH2 bH bVL "\n");
1943*08b48e0bSAndroid Build Coastguard Worker
1944*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->custom_only)) {
1945*08b48e0bSAndroid Build Coastguard Worker
1946*08b48e0bSAndroid Build Coastguard Worker strcpy(tmp, "oven off (custom-mutator-only mode)");
1947*08b48e0bSAndroid Build Coastguard Worker
1948*08b48e0bSAndroid Build Coastguard Worker } else if (likely(afl->skip_deterministic)) {
1949*08b48e0bSAndroid Build Coastguard Worker
1950*08b48e0bSAndroid Build Coastguard Worker strcpy(tmp, "oven off (default, enable with -D)");
1951*08b48e0bSAndroid Build Coastguard Worker
1952*08b48e0bSAndroid Build Coastguard Worker } else {
1953*08b48e0bSAndroid Build Coastguard Worker
1954*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s/%s, %s/%s, %s/%s",
1955*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(0), afl->stage_finds[STAGE_FLIP1]),
1956*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(1), afl->stage_cycles[STAGE_FLIP1]),
1957*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(2), afl->stage_finds[STAGE_FLIP2]),
1958*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(3), afl->stage_cycles[STAGE_FLIP2]),
1959*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(4), afl->stage_finds[STAGE_FLIP4]),
1960*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(5), afl->stage_cycles[STAGE_FLIP4]));
1961*08b48e0bSAndroid Build Coastguard Worker
1962*08b48e0bSAndroid Build Coastguard Worker }
1963*08b48e0bSAndroid Build Coastguard Worker
1964*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP
1965*08b48e0bSAndroid Build Coastguard Worker " pizzas for celiac : " cRST "%-36s " bSTG bV bSTOP
1966*08b48e0bSAndroid Build Coastguard Worker " levels : " cRST "%-10s " bSTG bV
1967*08b48e0bSAndroid Build Coastguard Worker "\n",
1968*08b48e0bSAndroid Build Coastguard Worker tmp, u_stringify_int(IB(0), afl->max_depth));
1969*08b48e0bSAndroid Build Coastguard Worker
1970*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!afl->skip_deterministic)) {
1971*08b48e0bSAndroid Build Coastguard Worker
1972*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s/%s, %s/%s, %s/%s",
1973*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(0), afl->stage_finds[STAGE_FLIP8]),
1974*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(1), afl->stage_cycles[STAGE_FLIP8]),
1975*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(2), afl->stage_finds[STAGE_FLIP16]),
1976*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(3), afl->stage_cycles[STAGE_FLIP16]),
1977*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(4), afl->stage_finds[STAGE_FLIP32]),
1978*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(5), afl->stage_cycles[STAGE_FLIP32]));
1979*08b48e0bSAndroid Build Coastguard Worker
1980*08b48e0bSAndroid Build Coastguard Worker }
1981*08b48e0bSAndroid Build Coastguard Worker
1982*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP
1983*08b48e0bSAndroid Build Coastguard Worker " pizzas for kids : " cRST "%-36s " bSTG bV bSTOP
1984*08b48e0bSAndroid Build Coastguard Worker " pizzas to make : " cRST "%-10s " bSTG bV
1985*08b48e0bSAndroid Build Coastguard Worker "\n",
1986*08b48e0bSAndroid Build Coastguard Worker tmp, u_stringify_int(IB(0), afl->pending_not_fuzzed));
1987*08b48e0bSAndroid Build Coastguard Worker
1988*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!afl->skip_deterministic)) {
1989*08b48e0bSAndroid Build Coastguard Worker
1990*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s/%s, %s/%s, %s/%s",
1991*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(0), afl->stage_finds[STAGE_ARITH8]),
1992*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(1), afl->stage_cycles[STAGE_ARITH8]),
1993*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(2), afl->stage_finds[STAGE_ARITH16]),
1994*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(3), afl->stage_cycles[STAGE_ARITH16]),
1995*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(4), afl->stage_finds[STAGE_ARITH32]),
1996*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(5), afl->stage_cycles[STAGE_ARITH32]));
1997*08b48e0bSAndroid Build Coastguard Worker
1998*08b48e0bSAndroid Build Coastguard Worker }
1999*08b48e0bSAndroid Build Coastguard Worker
2000*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP
2001*08b48e0bSAndroid Build Coastguard Worker " pizza bianca : " cRST "%-36s " bSTG bV bSTOP
2002*08b48e0bSAndroid Build Coastguard Worker " nice table : " cRST "%-10s " bSTG bV
2003*08b48e0bSAndroid Build Coastguard Worker "\n",
2004*08b48e0bSAndroid Build Coastguard Worker tmp, u_stringify_int(IB(0), afl->pending_favored));
2005*08b48e0bSAndroid Build Coastguard Worker
2006*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!afl->skip_deterministic)) {
2007*08b48e0bSAndroid Build Coastguard Worker
2008*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s/%s, %s/%s, %s/%s",
2009*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(0), afl->stage_finds[STAGE_INTEREST8]),
2010*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(1), afl->stage_cycles[STAGE_INTEREST8]),
2011*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(2), afl->stage_finds[STAGE_INTEREST16]),
2012*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(3), afl->stage_cycles[STAGE_INTEREST16]),
2013*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(4), afl->stage_finds[STAGE_INTEREST32]),
2014*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(5), afl->stage_cycles[STAGE_INTEREST32]));
2015*08b48e0bSAndroid Build Coastguard Worker
2016*08b48e0bSAndroid Build Coastguard Worker }
2017*08b48e0bSAndroid Build Coastguard Worker
2018*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP
2019*08b48e0bSAndroid Build Coastguard Worker " recurring customers : " cRST "%-36s " bSTG bV bSTOP
2020*08b48e0bSAndroid Build Coastguard Worker " new customers : " cRST "%-10s " bSTG bV
2021*08b48e0bSAndroid Build Coastguard Worker "\n",
2022*08b48e0bSAndroid Build Coastguard Worker tmp, u_stringify_int(IB(0), afl->queued_discovered));
2023*08b48e0bSAndroid Build Coastguard Worker
2024*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!afl->skip_deterministic)) {
2025*08b48e0bSAndroid Build Coastguard Worker
2026*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s/%s, %s/%s, %s/%s, %s/%s",
2027*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(0), afl->stage_finds[STAGE_EXTRAS_UO]),
2028*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(1), afl->stage_cycles[STAGE_EXTRAS_UO]),
2029*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(2), afl->stage_finds[STAGE_EXTRAS_UI]),
2030*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(3), afl->stage_cycles[STAGE_EXTRAS_UI]),
2031*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(4), afl->stage_finds[STAGE_EXTRAS_AO]),
2032*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(5), afl->stage_cycles[STAGE_EXTRAS_AO]),
2033*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(6), afl->stage_finds[STAGE_EXTRAS_AI]),
2034*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(7), afl->stage_cycles[STAGE_EXTRAS_AI]));
2035*08b48e0bSAndroid Build Coastguard Worker
2036*08b48e0bSAndroid Build Coastguard Worker } else if (unlikely(!afl->extras_cnt || afl->custom_only)) {
2037*08b48e0bSAndroid Build Coastguard Worker
2038*08b48e0bSAndroid Build Coastguard Worker strcpy(tmp, "n/a");
2039*08b48e0bSAndroid Build Coastguard Worker
2040*08b48e0bSAndroid Build Coastguard Worker } else {
2041*08b48e0bSAndroid Build Coastguard Worker
2042*08b48e0bSAndroid Build Coastguard Worker strcpy(tmp, "18 year aniversary mode");
2043*08b48e0bSAndroid Build Coastguard Worker
2044*08b48e0bSAndroid Build Coastguard Worker }
2045*08b48e0bSAndroid Build Coastguard Worker
2046*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP
2047*08b48e0bSAndroid Build Coastguard Worker " dictionary : " cRST "%-36s " bSTG bV bSTOP
2048*08b48e0bSAndroid Build Coastguard Worker " patrons from old resturant : " cRST "%-10s " bSTG bV
2049*08b48e0bSAndroid Build Coastguard Worker "\n",
2050*08b48e0bSAndroid Build Coastguard Worker tmp,
2051*08b48e0bSAndroid Build Coastguard Worker afl->sync_id ? u_stringify_int(IB(0), afl->queued_imported)
2052*08b48e0bSAndroid Build Coastguard Worker : (u8 *)"n/a");
2053*08b48e0bSAndroid Build Coastguard Worker
2054*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s/%s, %s/%s",
2055*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(0), afl->stage_finds[STAGE_HAVOC]),
2056*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(2), afl->stage_cycles[STAGE_HAVOC]),
2057*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(3), afl->stage_finds[STAGE_SPLICE]),
2058*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(4), afl->stage_cycles[STAGE_SPLICE]));
2059*08b48e0bSAndroid Build Coastguard Worker
2060*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP " 18 year anniversary mode/cleaning : " cRST
2061*08b48e0bSAndroid Build Coastguard Worker "%-36s " bSTG bV bSTOP,
2062*08b48e0bSAndroid Build Coastguard Worker tmp);
2063*08b48e0bSAndroid Build Coastguard Worker
2064*08b48e0bSAndroid Build Coastguard Worker if (t_bytes) {
2065*08b48e0bSAndroid Build Coastguard Worker
2066*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%0.02f%%", stab_ratio);
2067*08b48e0bSAndroid Build Coastguard Worker
2068*08b48e0bSAndroid Build Coastguard Worker } else {
2069*08b48e0bSAndroid Build Coastguard Worker
2070*08b48e0bSAndroid Build Coastguard Worker strcpy(tmp, "n/a");
2071*08b48e0bSAndroid Build Coastguard Worker
2072*08b48e0bSAndroid Build Coastguard Worker }
2073*08b48e0bSAndroid Build Coastguard Worker
2074*08b48e0bSAndroid Build Coastguard Worker SAYF(" oven flameout : %s%-10s " bSTG bV "\n",
2075*08b48e0bSAndroid Build Coastguard Worker (stab_ratio < 85 && afl->var_byte_count > 40)
2076*08b48e0bSAndroid Build Coastguard Worker ? cLRD
2077*08b48e0bSAndroid Build Coastguard Worker : ((afl->queued_variable &&
2078*08b48e0bSAndroid Build Coastguard Worker (!afl->persistent_mode || afl->var_byte_count > 20))
2079*08b48e0bSAndroid Build Coastguard Worker ? cMGN
2080*08b48e0bSAndroid Build Coastguard Worker : cRST),
2081*08b48e0bSAndroid Build Coastguard Worker tmp);
2082*08b48e0bSAndroid Build Coastguard Worker
2083*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->afl_env.afl_python_module)) {
2084*08b48e0bSAndroid Build Coastguard Worker
2085*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%s/%s,",
2086*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(0), afl->stage_finds[STAGE_PYTHON]),
2087*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(1), afl->stage_cycles[STAGE_PYTHON]));
2088*08b48e0bSAndroid Build Coastguard Worker
2089*08b48e0bSAndroid Build Coastguard Worker } else {
2090*08b48e0bSAndroid Build Coastguard Worker
2091*08b48e0bSAndroid Build Coastguard Worker strcpy(tmp, "unused,");
2092*08b48e0bSAndroid Build Coastguard Worker
2093*08b48e0bSAndroid Build Coastguard Worker }
2094*08b48e0bSAndroid Build Coastguard Worker
2095*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->afl_env.afl_custom_mutator_library)) {
2096*08b48e0bSAndroid Build Coastguard Worker
2097*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, " ");
2098*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, u_stringify_int(IB(2), afl->stage_finds[STAGE_CUSTOM_MUTATOR]));
2099*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, "/");
2100*08b48e0bSAndroid Build Coastguard Worker strcat(tmp,
2101*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(3), afl->stage_cycles[STAGE_CUSTOM_MUTATOR]));
2102*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, ",");
2103*08b48e0bSAndroid Build Coastguard Worker
2104*08b48e0bSAndroid Build Coastguard Worker } else {
2105*08b48e0bSAndroid Build Coastguard Worker
2106*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, " unused,");
2107*08b48e0bSAndroid Build Coastguard Worker
2108*08b48e0bSAndroid Build Coastguard Worker }
2109*08b48e0bSAndroid Build Coastguard Worker
2110*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->shm.cmplog_mode)) {
2111*08b48e0bSAndroid Build Coastguard Worker
2112*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, " ");
2113*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, u_stringify_int(IB(4), afl->stage_finds[STAGE_COLORIZATION]));
2114*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, "/");
2115*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, u_stringify_int(IB(5), afl->stage_cycles[STAGE_COLORIZATION]));
2116*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, ", ");
2117*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, u_stringify_int(IB(6), afl->stage_finds[STAGE_ITS]));
2118*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, "/");
2119*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, u_stringify_int(IB(7), afl->stage_cycles[STAGE_ITS]));
2120*08b48e0bSAndroid Build Coastguard Worker
2121*08b48e0bSAndroid Build Coastguard Worker } else {
2122*08b48e0bSAndroid Build Coastguard Worker
2123*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, " unused, unused");
2124*08b48e0bSAndroid Build Coastguard Worker
2125*08b48e0bSAndroid Build Coastguard Worker }
2126*08b48e0bSAndroid Build Coastguard Worker
2127*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP " py/custom/rq : " cRST
2128*08b48e0bSAndroid Build Coastguard Worker "%-36s " bSTG bVR bH20 bH2 bH30 bH2 bH bH bRB "\n",
2129*08b48e0bSAndroid Build Coastguard Worker tmp);
2130*08b48e0bSAndroid Build Coastguard Worker
2131*08b48e0bSAndroid Build Coastguard Worker if (likely(afl->disable_trim)) {
2132*08b48e0bSAndroid Build Coastguard Worker
2133*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "disabled, ");
2134*08b48e0bSAndroid Build Coastguard Worker
2135*08b48e0bSAndroid Build Coastguard Worker } else if (unlikely(!afl->bytes_trim_out)) {
2136*08b48e0bSAndroid Build Coastguard Worker
2137*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "n/a, ");
2138*08b48e0bSAndroid Build Coastguard Worker
2139*08b48e0bSAndroid Build Coastguard Worker } else {
2140*08b48e0bSAndroid Build Coastguard Worker
2141*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp, "%0.02f%%/%s, ",
2142*08b48e0bSAndroid Build Coastguard Worker ((double)(afl->bytes_trim_in - afl->bytes_trim_out)) * 100 /
2143*08b48e0bSAndroid Build Coastguard Worker afl->bytes_trim_in,
2144*08b48e0bSAndroid Build Coastguard Worker u_stringify_int(IB(0), afl->trim_execs));
2145*08b48e0bSAndroid Build Coastguard Worker
2146*08b48e0bSAndroid Build Coastguard Worker }
2147*08b48e0bSAndroid Build Coastguard Worker
2148*08b48e0bSAndroid Build Coastguard Worker if (likely(afl->skip_deterministic)) {
2149*08b48e0bSAndroid Build Coastguard Worker
2150*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, "disabled");
2151*08b48e0bSAndroid Build Coastguard Worker
2152*08b48e0bSAndroid Build Coastguard Worker } else if (unlikely(!afl->blocks_eff_total)) {
2153*08b48e0bSAndroid Build Coastguard Worker
2154*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, "n/a");
2155*08b48e0bSAndroid Build Coastguard Worker
2156*08b48e0bSAndroid Build Coastguard Worker } else {
2157*08b48e0bSAndroid Build Coastguard Worker
2158*08b48e0bSAndroid Build Coastguard Worker u8 tmp2[128];
2159*08b48e0bSAndroid Build Coastguard Worker
2160*08b48e0bSAndroid Build Coastguard Worker sprintf(tmp2, "%0.02f%%",
2161*08b48e0bSAndroid Build Coastguard Worker ((double)(afl->blocks_eff_total - afl->blocks_eff_select)) * 100 /
2162*08b48e0bSAndroid Build Coastguard Worker afl->blocks_eff_total);
2163*08b48e0bSAndroid Build Coastguard Worker
2164*08b48e0bSAndroid Build Coastguard Worker strcat(tmp, tmp2);
2165*08b48e0bSAndroid Build Coastguard Worker
2166*08b48e0bSAndroid Build Coastguard Worker }
2167*08b48e0bSAndroid Build Coastguard Worker
2168*08b48e0bSAndroid Build Coastguard Worker // if (afl->custom_mutators_count) {
2169*08b48e0bSAndroid Build Coastguard Worker
2170*08b48e0bSAndroid Build Coastguard Worker //
2171*08b48e0bSAndroid Build Coastguard Worker // sprintf(tmp, "%s/%s",
2172*08b48e0bSAndroid Build Coastguard Worker // u_stringify_int(IB(0), afl->stage_finds[STAGE_CUSTOM_MUTATOR]),
2173*08b48e0bSAndroid Build Coastguard Worker // u_stringify_int(IB(1), afl->stage_cycles[STAGE_CUSTOM_MUTATOR]));
2174*08b48e0bSAndroid Build Coastguard Worker // SAYF(bV bSTOP " custom mut. : " cRST "%-36s " bSTG bV RESET_G1, tmp);
2175*08b48e0bSAndroid Build Coastguard Worker //
2176*08b48e0bSAndroid Build Coastguard Worker //} else {
2177*08b48e0bSAndroid Build Coastguard Worker
2178*08b48e0bSAndroid Build Coastguard Worker SAYF(bV bSTOP " toilets clogged : " cRST
2179*08b48e0bSAndroid Build Coastguard Worker "%-36s " bSTG bV RESET_G1,
2180*08b48e0bSAndroid Build Coastguard Worker tmp);
2181*08b48e0bSAndroid Build Coastguard Worker
2182*08b48e0bSAndroid Build Coastguard Worker //}
2183*08b48e0bSAndroid Build Coastguard Worker
2184*08b48e0bSAndroid Build Coastguard Worker /* Provide some CPU utilization stats. */
2185*08b48e0bSAndroid Build Coastguard Worker
2186*08b48e0bSAndroid Build Coastguard Worker if (afl->cpu_core_count) {
2187*08b48e0bSAndroid Build Coastguard Worker
2188*08b48e0bSAndroid Build Coastguard Worker char *spacing = SP10, snap[80] = " " cLGN "Pizzaioli's busyness " cRST " ";
2189*08b48e0bSAndroid Build Coastguard Worker
2190*08b48e0bSAndroid Build Coastguard Worker double cur_runnable = get_runnable_processes();
2191*08b48e0bSAndroid Build Coastguard Worker u32 cur_utilization = cur_runnable * 100 / afl->cpu_core_count;
2192*08b48e0bSAndroid Build Coastguard Worker
2193*08b48e0bSAndroid Build Coastguard Worker u8 *cpu_color = cCYA;
2194*08b48e0bSAndroid Build Coastguard Worker
2195*08b48e0bSAndroid Build Coastguard Worker /* If we could still run one or more processes, use green. */
2196*08b48e0bSAndroid Build Coastguard Worker
2197*08b48e0bSAndroid Build Coastguard Worker if (afl->cpu_core_count > 1 && cur_runnable + 1 <= afl->cpu_core_count) {
2198*08b48e0bSAndroid Build Coastguard Worker
2199*08b48e0bSAndroid Build Coastguard Worker cpu_color = cLGN;
2200*08b48e0bSAndroid Build Coastguard Worker
2201*08b48e0bSAndroid Build Coastguard Worker }
2202*08b48e0bSAndroid Build Coastguard Worker
2203*08b48e0bSAndroid Build Coastguard Worker /* If we're clearly oversubscribed, use red. */
2204*08b48e0bSAndroid Build Coastguard Worker
2205*08b48e0bSAndroid Build Coastguard Worker if (!afl->no_cpu_meter_red && cur_utilization >= 150) { cpu_color = cLRD; }
2206*08b48e0bSAndroid Build Coastguard Worker
2207*08b48e0bSAndroid Build Coastguard Worker if (afl->fsrv.snapshot) { spacing = snap; }
2208*08b48e0bSAndroid Build Coastguard Worker
2209*08b48e0bSAndroid Build Coastguard Worker #ifdef HAVE_AFFINITY
2210*08b48e0bSAndroid Build Coastguard Worker
2211*08b48e0bSAndroid Build Coastguard Worker if (afl->cpu_aff >= 0) {
2212*08b48e0bSAndroid Build Coastguard Worker
2213*08b48e0bSAndroid Build Coastguard Worker SAYF("%s" cGRA "[cpu%03u:%s%3u%%" cGRA "]\r" cRST, spacing,
2214*08b48e0bSAndroid Build Coastguard Worker MIN(afl->cpu_aff, 999), cpu_color, MIN(cur_utilization, (u32)999));
2215*08b48e0bSAndroid Build Coastguard Worker
2216*08b48e0bSAndroid Build Coastguard Worker } else {
2217*08b48e0bSAndroid Build Coastguard Worker
2218*08b48e0bSAndroid Build Coastguard Worker SAYF("%s" cGRA " [cpu:%s%3u%%" cGRA "]\r" cRST, spacing, cpu_color,
2219*08b48e0bSAndroid Build Coastguard Worker MIN(cur_utilization, (u32)999));
2220*08b48e0bSAndroid Build Coastguard Worker
2221*08b48e0bSAndroid Build Coastguard Worker }
2222*08b48e0bSAndroid Build Coastguard Worker
2223*08b48e0bSAndroid Build Coastguard Worker #else
2224*08b48e0bSAndroid Build Coastguard Worker
2225*08b48e0bSAndroid Build Coastguard Worker SAYF("%s" cGRA " [cpu:%s%3u%%" cGRA "]\r" cRST, spacing, cpu_color,
2226*08b48e0bSAndroid Build Coastguard Worker MIN(cur_utilization, (u32)999));
2227*08b48e0bSAndroid Build Coastguard Worker
2228*08b48e0bSAndroid Build Coastguard Worker #endif /* ^HAVE_AFFINITY */
2229*08b48e0bSAndroid Build Coastguard Worker
2230*08b48e0bSAndroid Build Coastguard Worker } else {
2231*08b48e0bSAndroid Build Coastguard Worker
2232*08b48e0bSAndroid Build Coastguard Worker SAYF("\r");
2233*08b48e0bSAndroid Build Coastguard Worker
2234*08b48e0bSAndroid Build Coastguard Worker }
2235*08b48e0bSAndroid Build Coastguard Worker
2236*08b48e0bSAndroid Build Coastguard Worker /* Last line */
2237*08b48e0bSAndroid Build Coastguard Worker SAYF(SET_G1 "\n" bSTG bLB bH30 bH20 bH2 bH20 bH2 bH bRB bSTOP cRST RESET_G1);
2238*08b48e0bSAndroid Build Coastguard Worker
2239*08b48e0bSAndroid Build Coastguard Worker #undef IB
2240*08b48e0bSAndroid Build Coastguard Worker
2241*08b48e0bSAndroid Build Coastguard Worker /* Hallelujah! */
2242*08b48e0bSAndroid Build Coastguard Worker
2243*08b48e0bSAndroid Build Coastguard Worker fflush(0);
2244*08b48e0bSAndroid Build Coastguard Worker
2245*08b48e0bSAndroid Build Coastguard Worker }
2246*08b48e0bSAndroid Build Coastguard Worker
2247*08b48e0bSAndroid Build Coastguard Worker /* Display quick statistics at the end of processing the input directory,
2248*08b48e0bSAndroid Build Coastguard Worker plus a bunch of warnings. Some calibration stuff also ended up here,
2249*08b48e0bSAndroid Build Coastguard Worker along with several hardcoded constants. Maybe clean up eventually. */
2250*08b48e0bSAndroid Build Coastguard Worker
2251*08b48e0bSAndroid Build Coastguard Worker void show_init_stats(afl_state_t *afl) {
2252*08b48e0bSAndroid Build Coastguard Worker
2253*08b48e0bSAndroid Build Coastguard Worker struct queue_entry *q;
2254*08b48e0bSAndroid Build Coastguard Worker u32 min_bits = 0, max_bits = 0, max_len = 0, count = 0, i;
2255*08b48e0bSAndroid Build Coastguard Worker u64 min_us = 0, max_us = 0;
2256*08b48e0bSAndroid Build Coastguard Worker u64 avg_us = 0;
2257*08b48e0bSAndroid Build Coastguard Worker
2258*08b48e0bSAndroid Build Coastguard Worker u8 val_bufs[4][STRINGIFY_VAL_SIZE_MAX];
2259*08b48e0bSAndroid Build Coastguard Worker #define IB(i) val_bufs[(i)], sizeof(val_bufs[(i)])
2260*08b48e0bSAndroid Build Coastguard Worker
2261*08b48e0bSAndroid Build Coastguard Worker if (afl->total_cal_cycles) {
2262*08b48e0bSAndroid Build Coastguard Worker
2263*08b48e0bSAndroid Build Coastguard Worker avg_us = afl->total_cal_us / afl->total_cal_cycles;
2264*08b48e0bSAndroid Build Coastguard Worker
2265*08b48e0bSAndroid Build Coastguard Worker }
2266*08b48e0bSAndroid Build Coastguard Worker
2267*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < afl->queued_items; i++) {
2268*08b48e0bSAndroid Build Coastguard Worker
2269*08b48e0bSAndroid Build Coastguard Worker q = afl->queue_buf[i];
2270*08b48e0bSAndroid Build Coastguard Worker if (unlikely(q->disabled)) { continue; }
2271*08b48e0bSAndroid Build Coastguard Worker
2272*08b48e0bSAndroid Build Coastguard Worker if (!min_us || q->exec_us < min_us) { min_us = q->exec_us; }
2273*08b48e0bSAndroid Build Coastguard Worker if (q->exec_us > max_us) { max_us = q->exec_us; }
2274*08b48e0bSAndroid Build Coastguard Worker
2275*08b48e0bSAndroid Build Coastguard Worker if (!min_bits || q->bitmap_size < min_bits) { min_bits = q->bitmap_size; }
2276*08b48e0bSAndroid Build Coastguard Worker if (q->bitmap_size > max_bits) { max_bits = q->bitmap_size; }
2277*08b48e0bSAndroid Build Coastguard Worker
2278*08b48e0bSAndroid Build Coastguard Worker if (q->len > max_len) { max_len = q->len; }
2279*08b48e0bSAndroid Build Coastguard Worker
2280*08b48e0bSAndroid Build Coastguard Worker ++count;
2281*08b48e0bSAndroid Build Coastguard Worker
2282*08b48e0bSAndroid Build Coastguard Worker }
2283*08b48e0bSAndroid Build Coastguard Worker
2284*08b48e0bSAndroid Build Coastguard Worker // SAYF("\n");
2285*08b48e0bSAndroid Build Coastguard Worker
2286*08b48e0bSAndroid Build Coastguard Worker if (avg_us > ((afl->fsrv.cs_mode || afl->fsrv.qemu_mode || afl->unicorn_mode)
2287*08b48e0bSAndroid Build Coastguard Worker ? 50000
2288*08b48e0bSAndroid Build Coastguard Worker : 10000)) {
2289*08b48e0bSAndroid Build Coastguard Worker
2290*08b48e0bSAndroid Build Coastguard Worker WARNF(cLRD
2291*08b48e0bSAndroid Build Coastguard Worker "The target binary is pretty slow! See "
2292*08b48e0bSAndroid Build Coastguard Worker "%s/fuzzing_in_depth.md#i-improve-the-speed",
2293*08b48e0bSAndroid Build Coastguard Worker doc_path);
2294*08b48e0bSAndroid Build Coastguard Worker
2295*08b48e0bSAndroid Build Coastguard Worker }
2296*08b48e0bSAndroid Build Coastguard Worker
2297*08b48e0bSAndroid Build Coastguard Worker /* Let's keep things moving with slow binaries. */
2298*08b48e0bSAndroid Build Coastguard Worker
2299*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->fixed_seed)) {
2300*08b48e0bSAndroid Build Coastguard Worker
2301*08b48e0bSAndroid Build Coastguard Worker afl->havoc_div = 1;
2302*08b48e0bSAndroid Build Coastguard Worker
2303*08b48e0bSAndroid Build Coastguard Worker } else if (avg_us > 50000) {
2304*08b48e0bSAndroid Build Coastguard Worker
2305*08b48e0bSAndroid Build Coastguard Worker afl->havoc_div = 10; /* 0-19 execs/sec */
2306*08b48e0bSAndroid Build Coastguard Worker
2307*08b48e0bSAndroid Build Coastguard Worker } else if (avg_us > 20000) {
2308*08b48e0bSAndroid Build Coastguard Worker
2309*08b48e0bSAndroid Build Coastguard Worker afl->havoc_div = 5; /* 20-49 execs/sec */
2310*08b48e0bSAndroid Build Coastguard Worker
2311*08b48e0bSAndroid Build Coastguard Worker } else if (avg_us > 10000) {
2312*08b48e0bSAndroid Build Coastguard Worker
2313*08b48e0bSAndroid Build Coastguard Worker afl->havoc_div = 2; /* 50-100 execs/sec */
2314*08b48e0bSAndroid Build Coastguard Worker
2315*08b48e0bSAndroid Build Coastguard Worker }
2316*08b48e0bSAndroid Build Coastguard Worker
2317*08b48e0bSAndroid Build Coastguard Worker if (!afl->resuming_fuzz) {
2318*08b48e0bSAndroid Build Coastguard Worker
2319*08b48e0bSAndroid Build Coastguard Worker if (max_len > 50 * 1024) {
2320*08b48e0bSAndroid Build Coastguard Worker
2321*08b48e0bSAndroid Build Coastguard Worker WARNF(cLRD
2322*08b48e0bSAndroid Build Coastguard Worker "Some test cases are huge (%s) - see "
2323*08b48e0bSAndroid Build Coastguard Worker "%s/fuzzing_in_depth.md#i-improve-the-speed",
2324*08b48e0bSAndroid Build Coastguard Worker stringify_mem_size(IB(0), max_len), doc_path);
2325*08b48e0bSAndroid Build Coastguard Worker
2326*08b48e0bSAndroid Build Coastguard Worker } else if (max_len > 10 * 1024) {
2327*08b48e0bSAndroid Build Coastguard Worker
2328*08b48e0bSAndroid Build Coastguard Worker WARNF(
2329*08b48e0bSAndroid Build Coastguard Worker "Some test cases are big (%s) - see "
2330*08b48e0bSAndroid Build Coastguard Worker "%s/fuzzing_in_depth.md#i-improve-the-speed",
2331*08b48e0bSAndroid Build Coastguard Worker stringify_mem_size(IB(0), max_len), doc_path);
2332*08b48e0bSAndroid Build Coastguard Worker
2333*08b48e0bSAndroid Build Coastguard Worker }
2334*08b48e0bSAndroid Build Coastguard Worker
2335*08b48e0bSAndroid Build Coastguard Worker if (afl->useless_at_start && !afl->in_bitmap) {
2336*08b48e0bSAndroid Build Coastguard Worker
2337*08b48e0bSAndroid Build Coastguard Worker WARNF(cLRD "Some test cases look useless. Consider using a smaller set.");
2338*08b48e0bSAndroid Build Coastguard Worker
2339*08b48e0bSAndroid Build Coastguard Worker }
2340*08b48e0bSAndroid Build Coastguard Worker
2341*08b48e0bSAndroid Build Coastguard Worker if (afl->queued_items > 100) {
2342*08b48e0bSAndroid Build Coastguard Worker
2343*08b48e0bSAndroid Build Coastguard Worker WARNF(cLRD
2344*08b48e0bSAndroid Build Coastguard Worker "You probably have far too many input files! Consider trimming "
2345*08b48e0bSAndroid Build Coastguard Worker "down.");
2346*08b48e0bSAndroid Build Coastguard Worker
2347*08b48e0bSAndroid Build Coastguard Worker } else if (afl->queued_items > 20) {
2348*08b48e0bSAndroid Build Coastguard Worker
2349*08b48e0bSAndroid Build Coastguard Worker WARNF("You have lots of input files; try starting small.");
2350*08b48e0bSAndroid Build Coastguard Worker
2351*08b48e0bSAndroid Build Coastguard Worker }
2352*08b48e0bSAndroid Build Coastguard Worker
2353*08b48e0bSAndroid Build Coastguard Worker }
2354*08b48e0bSAndroid Build Coastguard Worker
2355*08b48e0bSAndroid Build Coastguard Worker OKF("Here are some useful stats:\n\n"
2356*08b48e0bSAndroid Build Coastguard Worker
2357*08b48e0bSAndroid Build Coastguard Worker cGRA " Test case count : " cRST
2358*08b48e0bSAndroid Build Coastguard Worker "%u favored, %u variable, %u ignored, %u total\n" cGRA
2359*08b48e0bSAndroid Build Coastguard Worker " Bitmap range : " cRST
2360*08b48e0bSAndroid Build Coastguard Worker "%u to %u bits (average: %0.02f bits)\n" cGRA
2361*08b48e0bSAndroid Build Coastguard Worker " Exec timing : " cRST "%s to %s us (average: %s us)\n",
2362*08b48e0bSAndroid Build Coastguard Worker afl->queued_favored, afl->queued_variable, afl->queued_items - count,
2363*08b48e0bSAndroid Build Coastguard Worker afl->queued_items, min_bits, max_bits,
2364*08b48e0bSAndroid Build Coastguard Worker ((double)afl->total_bitmap_size) /
2365*08b48e0bSAndroid Build Coastguard Worker (afl->total_bitmap_entries ? afl->total_bitmap_entries : 1),
2366*08b48e0bSAndroid Build Coastguard Worker stringify_int(IB(0), min_us), stringify_int(IB(1), max_us),
2367*08b48e0bSAndroid Build Coastguard Worker stringify_int(IB(2), avg_us));
2368*08b48e0bSAndroid Build Coastguard Worker
2369*08b48e0bSAndroid Build Coastguard Worker if (afl->timeout_given == 3) {
2370*08b48e0bSAndroid Build Coastguard Worker
2371*08b48e0bSAndroid Build Coastguard Worker ACTF("Applying timeout settings from resumed session (%u ms).",
2372*08b48e0bSAndroid Build Coastguard Worker afl->fsrv.exec_tmout);
2373*08b48e0bSAndroid Build Coastguard Worker
2374*08b48e0bSAndroid Build Coastguard Worker } else if (afl->timeout_given != 1) {
2375*08b48e0bSAndroid Build Coastguard Worker
2376*08b48e0bSAndroid Build Coastguard Worker /* Figure out the appropriate timeout. The basic idea is: 5x average or
2377*08b48e0bSAndroid Build Coastguard Worker 1x max, rounded up to EXEC_TM_ROUND ms and capped at 1 second.
2378*08b48e0bSAndroid Build Coastguard Worker
2379*08b48e0bSAndroid Build Coastguard Worker If the program is slow, the multiplier is lowered to 2x or 3x, because
2380*08b48e0bSAndroid Build Coastguard Worker random scheduler jitter is less likely to have any impact, and because
2381*08b48e0bSAndroid Build Coastguard Worker our patience is wearing thin =) */
2382*08b48e0bSAndroid Build Coastguard Worker
2383*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->fixed_seed)) {
2384*08b48e0bSAndroid Build Coastguard Worker
2385*08b48e0bSAndroid Build Coastguard Worker afl->fsrv.exec_tmout = avg_us * 5 / 1000;
2386*08b48e0bSAndroid Build Coastguard Worker
2387*08b48e0bSAndroid Build Coastguard Worker } else if (avg_us > 50000) {
2388*08b48e0bSAndroid Build Coastguard Worker
2389*08b48e0bSAndroid Build Coastguard Worker afl->fsrv.exec_tmout = avg_us * 2 / 1000;
2390*08b48e0bSAndroid Build Coastguard Worker
2391*08b48e0bSAndroid Build Coastguard Worker } else if (avg_us > 10000) {
2392*08b48e0bSAndroid Build Coastguard Worker
2393*08b48e0bSAndroid Build Coastguard Worker afl->fsrv.exec_tmout = avg_us * 3 / 1000;
2394*08b48e0bSAndroid Build Coastguard Worker
2395*08b48e0bSAndroid Build Coastguard Worker } else {
2396*08b48e0bSAndroid Build Coastguard Worker
2397*08b48e0bSAndroid Build Coastguard Worker afl->fsrv.exec_tmout = avg_us * 5 / 1000;
2398*08b48e0bSAndroid Build Coastguard Worker
2399*08b48e0bSAndroid Build Coastguard Worker }
2400*08b48e0bSAndroid Build Coastguard Worker
2401*08b48e0bSAndroid Build Coastguard Worker afl->fsrv.exec_tmout = MAX(afl->fsrv.exec_tmout, max_us / 1000);
2402*08b48e0bSAndroid Build Coastguard Worker afl->fsrv.exec_tmout =
2403*08b48e0bSAndroid Build Coastguard Worker (afl->fsrv.exec_tmout + EXEC_TM_ROUND) / EXEC_TM_ROUND * EXEC_TM_ROUND;
2404*08b48e0bSAndroid Build Coastguard Worker
2405*08b48e0bSAndroid Build Coastguard Worker if (afl->fsrv.exec_tmout > EXEC_TIMEOUT) {
2406*08b48e0bSAndroid Build Coastguard Worker
2407*08b48e0bSAndroid Build Coastguard Worker afl->fsrv.exec_tmout = EXEC_TIMEOUT;
2408*08b48e0bSAndroid Build Coastguard Worker
2409*08b48e0bSAndroid Build Coastguard Worker }
2410*08b48e0bSAndroid Build Coastguard Worker
2411*08b48e0bSAndroid Build Coastguard Worker ACTF("No -t option specified, so I'll use an exec timeout of %u ms.",
2412*08b48e0bSAndroid Build Coastguard Worker afl->fsrv.exec_tmout);
2413*08b48e0bSAndroid Build Coastguard Worker
2414*08b48e0bSAndroid Build Coastguard Worker afl->timeout_given = 1;
2415*08b48e0bSAndroid Build Coastguard Worker
2416*08b48e0bSAndroid Build Coastguard Worker } else {
2417*08b48e0bSAndroid Build Coastguard Worker
2418*08b48e0bSAndroid Build Coastguard Worker ACTF("-t option specified. We'll use an exec timeout of %u ms.",
2419*08b48e0bSAndroid Build Coastguard Worker afl->fsrv.exec_tmout);
2420*08b48e0bSAndroid Build Coastguard Worker
2421*08b48e0bSAndroid Build Coastguard Worker }
2422*08b48e0bSAndroid Build Coastguard Worker
2423*08b48e0bSAndroid Build Coastguard Worker /* In non-instrumented mode, re-running every timing out test case with a
2424*08b48e0bSAndroid Build Coastguard Worker generous time
2425*08b48e0bSAndroid Build Coastguard Worker limit is very expensive, so let's select a more conservative default. */
2426*08b48e0bSAndroid Build Coastguard Worker
2427*08b48e0bSAndroid Build Coastguard Worker if (afl->non_instrumented_mode && !(afl->afl_env.afl_hang_tmout)) {
2428*08b48e0bSAndroid Build Coastguard Worker
2429*08b48e0bSAndroid Build Coastguard Worker afl->hang_tmout = MIN((u32)EXEC_TIMEOUT, afl->fsrv.exec_tmout * 2 + 100);
2430*08b48e0bSAndroid Build Coastguard Worker
2431*08b48e0bSAndroid Build Coastguard Worker }
2432*08b48e0bSAndroid Build Coastguard Worker
2433*08b48e0bSAndroid Build Coastguard Worker OKF("All set and ready to roll!");
2434*08b48e0bSAndroid Build Coastguard Worker #undef IB
2435*08b48e0bSAndroid Build Coastguard Worker
2436*08b48e0bSAndroid Build Coastguard Worker }
2437*08b48e0bSAndroid Build Coastguard Worker
2438