xref: /aosp_15_r20/external/AFLplusplus/src/afl-fuzz-stats.c (revision 08b48e0b10e97b33e7b60c5b6e2243bd915777f2)
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