xref: /aosp_15_r20/external/AFLplusplus/afl-whatsup (revision 08b48e0b10e97b33e7b60c5b6e2243bd915777f2)
1*08b48e0bSAndroid Build Coastguard Worker#!/bin/sh
2*08b48e0bSAndroid Build Coastguard Worker#
3*08b48e0bSAndroid Build Coastguard Worker# american fuzzy lop++ - status check tool
4*08b48e0bSAndroid Build Coastguard Worker# ----------------------------------------
5*08b48e0bSAndroid Build Coastguard Worker#
6*08b48e0bSAndroid Build Coastguard Worker# Originally written by Michal Zalewski
7*08b48e0bSAndroid Build Coastguard Worker#
8*08b48e0bSAndroid Build Coastguard Worker# Copyright 2015 Google Inc. All rights reserved.
9*08b48e0bSAndroid Build Coastguard Worker# Copyright 2019-2024 AFLplusplus Project. All rights reserved.
10*08b48e0bSAndroid Build Coastguard Worker#
11*08b48e0bSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
12*08b48e0bSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
13*08b48e0bSAndroid Build Coastguard Worker# You may obtain a copy of the License at:
14*08b48e0bSAndroid Build Coastguard Worker#
15*08b48e0bSAndroid Build Coastguard Worker#   https://www.apache.org/licenses/LICENSE-2.0
16*08b48e0bSAndroid Build Coastguard Worker#
17*08b48e0bSAndroid Build Coastguard Worker# This tool summarizes the status of any locally-running synchronized
18*08b48e0bSAndroid Build Coastguard Worker# instances of afl-fuzz.
19*08b48e0bSAndroid Build Coastguard Worker#
20*08b48e0bSAndroid Build Coastguard Worker
21*08b48e0bSAndroid Build Coastguard Workertest "$1" = "-h" -o "$1" = "-hh" && {
22*08b48e0bSAndroid Build Coastguard Worker  echo "$0 status check tool for afl-fuzz by Michal Zalewski"
23*08b48e0bSAndroid Build Coastguard Worker  echo
24*08b48e0bSAndroid Build Coastguard Worker  echo "Usage: $0 [-s] [-d] afl_output_directory"
25*08b48e0bSAndroid Build Coastguard Worker  echo
26*08b48e0bSAndroid Build Coastguard Worker  echo Options:
27*08b48e0bSAndroid Build Coastguard Worker  echo "  -d  -  include dead fuzzer stats"
28*08b48e0bSAndroid Build Coastguard Worker  echo "  -m  -  just show minimal stats"
29*08b48e0bSAndroid Build Coastguard Worker  echo "  -n  -  no color output"
30*08b48e0bSAndroid Build Coastguard Worker  echo "  -s  -  skip details and output summary results only"
31*08b48e0bSAndroid Build Coastguard Worker  echo
32*08b48e0bSAndroid Build Coastguard Worker  exit 1
33*08b48e0bSAndroid Build Coastguard Worker}
34*08b48e0bSAndroid Build Coastguard Worker
35*08b48e0bSAndroid Build Coastguard Workerunset MINIMAL_ONLY
36*08b48e0bSAndroid Build Coastguard Workerunset NO_COLOR
37*08b48e0bSAndroid Build Coastguard Workerunset PROCESS_DEAD
38*08b48e0bSAndroid Build Coastguard Workerunset SUMMARY_ONLY
39*08b48e0bSAndroid Build Coastguard Workerunset RED
40*08b48e0bSAndroid Build Coastguard Workerunset GREEN
41*08b48e0bSAndroid Build Coastguard Workerunset YELLOW
42*08b48e0bSAndroid Build Coastguard Workerunset BLUE
43*08b48e0bSAndroid Build Coastguard Workerunset NC
44*08b48e0bSAndroid Build Coastguard Workerunset RESET
45*08b48e0bSAndroid Build Coastguard Worker
46*08b48e0bSAndroid Build Coastguard Workerif [ -z "$TERM" ]; then export TERM=vt220; fi
47*08b48e0bSAndroid Build Coastguard Worker
48*08b48e0bSAndroid Build Coastguard Workerwhile [ "$1" = "-d" -o "$1" = "-m"  -o "$1" = "-n"  -o "$1" = "-s" ]; do
49*08b48e0bSAndroid Build Coastguard Worker
50*08b48e0bSAndroid Build Coastguard Worker  if [ "$1" = "-d" ]; then
51*08b48e0bSAndroid Build Coastguard Worker    PROCESS_DEAD=1
52*08b48e0bSAndroid Build Coastguard Worker  fi
53*08b48e0bSAndroid Build Coastguard Worker
54*08b48e0bSAndroid Build Coastguard Worker  if [ "$1" = "-m" ]; then
55*08b48e0bSAndroid Build Coastguard Worker    MINIMAL_ONLY=1
56*08b48e0bSAndroid Build Coastguard Worker  fi
57*08b48e0bSAndroid Build Coastguard Worker
58*08b48e0bSAndroid Build Coastguard Worker  if [ "$1" = "-n" ]; then
59*08b48e0bSAndroid Build Coastguard Worker    NO_COLOR=1
60*08b48e0bSAndroid Build Coastguard Worker  fi
61*08b48e0bSAndroid Build Coastguard Worker
62*08b48e0bSAndroid Build Coastguard Worker  if [ "$1" = "-s" ]; then
63*08b48e0bSAndroid Build Coastguard Worker    SUMMARY_ONLY=1
64*08b48e0bSAndroid Build Coastguard Worker  fi
65*08b48e0bSAndroid Build Coastguard Worker
66*08b48e0bSAndroid Build Coastguard Worker  shift
67*08b48e0bSAndroid Build Coastguard Worker
68*08b48e0bSAndroid Build Coastguard Workerdone
69*08b48e0bSAndroid Build Coastguard Worker
70*08b48e0bSAndroid Build Coastguard WorkerDIR="$1"
71*08b48e0bSAndroid Build Coastguard Worker
72*08b48e0bSAndroid Build Coastguard Workerif [ "$DIR" = "" -o "$DIR" = "-h" -o "$DIR" = "--help" ]; then
73*08b48e0bSAndroid Build Coastguard Worker
74*08b48e0bSAndroid Build Coastguard Worker  echo "$0 status check tool for afl-fuzz by Michal Zalewski" 1>&2
75*08b48e0bSAndroid Build Coastguard Worker  echo 1>&2
76*08b48e0bSAndroid Build Coastguard Worker  echo "Usage: $0 [-d] [-m] [-n] [-s] afl_output_directory" 1>&2
77*08b48e0bSAndroid Build Coastguard Worker  echo 1>&2
78*08b48e0bSAndroid Build Coastguard Worker  echo Options: 1>&2
79*08b48e0bSAndroid Build Coastguard Worker  echo "  -d  -  include dead fuzzer stats" 1>&2
80*08b48e0bSAndroid Build Coastguard Worker  echo "  -m  -  just show minimal stats" 1>&2
81*08b48e0bSAndroid Build Coastguard Worker  echo "  -n  -  no color output" 1>&2
82*08b48e0bSAndroid Build Coastguard Worker  echo "  -s  -  skip details and output summary results only" 1>&2
83*08b48e0bSAndroid Build Coastguard Worker  echo 1>&2
84*08b48e0bSAndroid Build Coastguard Worker  exit 1
85*08b48e0bSAndroid Build Coastguard Worker
86*08b48e0bSAndroid Build Coastguard Workerfi
87*08b48e0bSAndroid Build Coastguard Worker
88*08b48e0bSAndroid Build Coastguard Workerif [ -z "$MINIMAL_ONLY" ]; then
89*08b48e0bSAndroid Build Coastguard Worker  echo "$0 status check tool for afl-fuzz by Michal Zalewski"
90*08b48e0bSAndroid Build Coastguard Worker  echo
91*08b48e0bSAndroid Build Coastguard Workerfi
92*08b48e0bSAndroid Build Coastguard Worker
93*08b48e0bSAndroid Build Coastguard Workercd "$DIR" || exit 1
94*08b48e0bSAndroid Build Coastguard Worker
95*08b48e0bSAndroid Build Coastguard Workerif [ -d queue ]; then
96*08b48e0bSAndroid Build Coastguard Worker
97*08b48e0bSAndroid Build Coastguard Worker  echo "[-] Error: parameter is an individual output directory, not a sync dir." 1>&2
98*08b48e0bSAndroid Build Coastguard Worker  exit 1
99*08b48e0bSAndroid Build Coastguard Worker
100*08b48e0bSAndroid Build Coastguard Workerfi
101*08b48e0bSAndroid Build Coastguard Worker
102*08b48e0bSAndroid Build Coastguard WorkerBC=`which bc 2>/dev/null`
103*08b48e0bSAndroid Build Coastguard WorkerFUSER=`which fuser 2>/dev/null`
104*08b48e0bSAndroid Build Coastguard Worker
105*08b48e0bSAndroid Build Coastguard Workerif [ -z "$NO_COLOR" ]; then
106*08b48e0bSAndroid Build Coastguard Worker  RED=`tput setaf 9 1 1 2>/dev/null`
107*08b48e0bSAndroid Build Coastguard Worker  GREEN=`tput setaf 2 1 1 2>/dev/null`
108*08b48e0bSAndroid Build Coastguard Worker  BLUE=`tput setaf 4 1 1 2>/dev/null`
109*08b48e0bSAndroid Build Coastguard Worker  YELLOW=`tput setaf 11 1 1 2>/dev/null`
110*08b48e0bSAndroid Build Coastguard Worker  NC=`tput sgr0`
111*08b48e0bSAndroid Build Coastguard Worker  RESET="$NC"
112*08b48e0bSAndroid Build Coastguard Workerfi
113*08b48e0bSAndroid Build Coastguard Worker
114*08b48e0bSAndroid Build Coastguard WorkerCUR_TIME=`date +%s`
115*08b48e0bSAndroid Build Coastguard Worker
116*08b48e0bSAndroid Build Coastguard WorkerTMP=`mktemp -t .afl-whatsup-XXXXXXXX` || TMP=`mktemp -p /data/local/tmp .afl-whatsup-XXXXXXXX` || TMP=`mktemp -p /data/local/tmp .afl-whatsup-XXXXXXXX` || exit 1
117*08b48e0bSAndroid Build Coastguard Worker
118*08b48e0bSAndroid Build Coastguard WorkerALIVE_CNT=0
119*08b48e0bSAndroid Build Coastguard WorkerDEAD_CNT=0
120*08b48e0bSAndroid Build Coastguard WorkerSTART_CNT=0
121*08b48e0bSAndroid Build Coastguard Worker
122*08b48e0bSAndroid Build Coastguard WorkerTOTAL_TIME=0
123*08b48e0bSAndroid Build Coastguard WorkerTOTAL_EXECS=0
124*08b48e0bSAndroid Build Coastguard WorkerTOTAL_EPS=0
125*08b48e0bSAndroid Build Coastguard WorkerTOTAL_CRASHES=0
126*08b48e0bSAndroid Build Coastguard WorkerTOTAL_HANGS=0
127*08b48e0bSAndroid Build Coastguard WorkerTOTAL_PFAV=0
128*08b48e0bSAndroid Build Coastguard WorkerTOTAL_PENDING=0
129*08b48e0bSAndroid Build Coastguard WorkerTOTAL_COVERAGE=
130*08b48e0bSAndroid Build Coastguard Worker
131*08b48e0bSAndroid Build Coastguard Worker# Time since last find / crash / hang, formatted as string
132*08b48e0bSAndroid Build Coastguard WorkerFMT_TIME="0 days 0 hours"
133*08b48e0bSAndroid Build Coastguard WorkerFMT_FIND="${RED}none seen yet${NC}"
134*08b48e0bSAndroid Build Coastguard WorkerFMT_CRASH="none seen yet"
135*08b48e0bSAndroid Build Coastguard WorkerFMT_HANG="none seen yet"
136*08b48e0bSAndroid Build Coastguard Worker
137*08b48e0bSAndroid Build Coastguard Workerif [ "$SUMMARY_ONLY" = "" ]; then
138*08b48e0bSAndroid Build Coastguard Worker
139*08b48e0bSAndroid Build Coastguard Worker  echo "Individual fuzzers"
140*08b48e0bSAndroid Build Coastguard Worker  echo "=================="
141*08b48e0bSAndroid Build Coastguard Worker  echo
142*08b48e0bSAndroid Build Coastguard Worker
143*08b48e0bSAndroid Build Coastguard Workerfi
144*08b48e0bSAndroid Build Coastguard Worker
145*08b48e0bSAndroid Build Coastguard Workerfmt_duration()
146*08b48e0bSAndroid Build Coastguard Worker{
147*08b48e0bSAndroid Build Coastguard Worker  DUR_STRING=
148*08b48e0bSAndroid Build Coastguard Worker  if [ $1 -le 0 ]; then
149*08b48e0bSAndroid Build Coastguard Worker    return 1
150*08b48e0bSAndroid Build Coastguard Worker  fi
151*08b48e0bSAndroid Build Coastguard Worker
152*08b48e0bSAndroid Build Coastguard Worker  local duration=$((CUR_TIME - $1))
153*08b48e0bSAndroid Build Coastguard Worker  local days=$((duration / 60 / 60 / 24))
154*08b48e0bSAndroid Build Coastguard Worker  local hours=$(((duration / 60 / 60) % 24))
155*08b48e0bSAndroid Build Coastguard Worker  local minutes=$(((duration / 60) % 60))
156*08b48e0bSAndroid Build Coastguard Worker  local seconds=$((duration % 60))
157*08b48e0bSAndroid Build Coastguard Worker
158*08b48e0bSAndroid Build Coastguard Worker  if [ $duration -le 0 ]; then
159*08b48e0bSAndroid Build Coastguard Worker    DUR_STRING="0 seconds"
160*08b48e0bSAndroid Build Coastguard Worker    elif [ $duration -eq 1 ]; then
161*08b48e0bSAndroid Build Coastguard Worker    DUR_STRING="1 second"
162*08b48e0bSAndroid Build Coastguard Worker    elif [ $days -gt 0 ]; then
163*08b48e0bSAndroid Build Coastguard Worker    DUR_STRING="$days days, $hours hours"
164*08b48e0bSAndroid Build Coastguard Worker    elif [ $hours -gt 0 ]; then
165*08b48e0bSAndroid Build Coastguard Worker    DUR_STRING="$hours hours, $minutes minutes"
166*08b48e0bSAndroid Build Coastguard Worker    elif [ $minutes -gt 0 ]; then
167*08b48e0bSAndroid Build Coastguard Worker    DUR_STRING="$minutes minutes, $seconds seconds"
168*08b48e0bSAndroid Build Coastguard Worker  else
169*08b48e0bSAndroid Build Coastguard Worker    DUR_STRING="$seconds seconds"
170*08b48e0bSAndroid Build Coastguard Worker  fi
171*08b48e0bSAndroid Build Coastguard Worker}
172*08b48e0bSAndroid Build Coastguard Worker
173*08b48e0bSAndroid Build Coastguard WorkerFIRST=true
174*08b48e0bSAndroid Build Coastguard WorkerTOTAL_WCOP=
175*08b48e0bSAndroid Build Coastguard WorkerTOTAL_LAST_FIND=0
176*08b48e0bSAndroid Build Coastguard Worker
177*08b48e0bSAndroid Build Coastguard Workerfor j in `find . -maxdepth 2 -iname fuzzer_setup | sort`; do
178*08b48e0bSAndroid Build Coastguard Worker
179*08b48e0bSAndroid Build Coastguard Worker  DIR=$(dirname "$j")
180*08b48e0bSAndroid Build Coastguard Worker  i=$DIR/fuzzer_stats
181*08b48e0bSAndroid Build Coastguard Worker
182*08b48e0bSAndroid Build Coastguard Worker  if [ -f "$i" ]; then
183*08b48e0bSAndroid Build Coastguard Worker
184*08b48e0bSAndroid Build Coastguard Worker    sed 's/^command_line.*$/_skip:1/;s/[ ]*:[ ]*/="/;s/$/"/' "$i" >"$TMP"
185*08b48e0bSAndroid Build Coastguard Worker    . "$TMP"
186*08b48e0bSAndroid Build Coastguard Worker    DIRECTORY=$DIR
187*08b48e0bSAndroid Build Coastguard Worker    DIR=${DIR##*/}
188*08b48e0bSAndroid Build Coastguard Worker    RUN_UNIX=$run_time
189*08b48e0bSAndroid Build Coastguard Worker    RUN_DAYS=$((RUN_UNIX / 60 / 60 / 24))
190*08b48e0bSAndroid Build Coastguard Worker    RUN_HRS=$(((RUN_UNIX / 60 / 60) % 24))
191*08b48e0bSAndroid Build Coastguard Worker    COVERAGE=$(echo $bitmap_cvg|tr -d %)
192*08b48e0bSAndroid Build Coastguard Worker    if [ -n "$TOTAL_COVERAGE" -a -n "$COVERAGE" -a -n "$BC" ]; then
193*08b48e0bSAndroid Build Coastguard Worker      if [ "$(echo "$TOTAL_COVERAGE < $COVERAGE" | bc)" -eq 1 ]; then
194*08b48e0bSAndroid Build Coastguard Worker        TOTAL_COVERAGE=$COVERAGE
195*08b48e0bSAndroid Build Coastguard Worker      fi
196*08b48e0bSAndroid Build Coastguard Worker    fi
197*08b48e0bSAndroid Build Coastguard Worker    if [ -z "$TOTAL_COVERAGE" ]; then TOTAL_COVERAGE=$COVERAGE ; fi
198*08b48e0bSAndroid Build Coastguard Worker
199*08b48e0bSAndroid Build Coastguard Worker    test -n "$cycles_wo_finds" && {
200*08b48e0bSAndroid Build Coastguard Worker      test -z "$FIRST" && TOTAL_WCOP="${TOTAL_WCOP}/"
201*08b48e0bSAndroid Build Coastguard Worker      TOTAL_WCOP="${TOTAL_WCOP}${cycles_wo_finds}"
202*08b48e0bSAndroid Build Coastguard Worker      FIRST=
203*08b48e0bSAndroid Build Coastguard Worker    }
204*08b48e0bSAndroid Build Coastguard Worker
205*08b48e0bSAndroid Build Coastguard Worker    if [ "$SUMMARY_ONLY" = "" ]; then
206*08b48e0bSAndroid Build Coastguard Worker
207*08b48e0bSAndroid Build Coastguard Worker      echo ">>> $afl_banner instance: $DIR ($RUN_DAYS days, $RUN_HRS hrs) fuzzer PID: $fuzzer_pid <<<"
208*08b48e0bSAndroid Build Coastguard Worker      echo
209*08b48e0bSAndroid Build Coastguard Worker
210*08b48e0bSAndroid Build Coastguard Worker    fi
211*08b48e0bSAndroid Build Coastguard Worker
212*08b48e0bSAndroid Build Coastguard Worker    if ! kill -0 "$fuzzer_pid" 2>/dev/null; then
213*08b48e0bSAndroid Build Coastguard Worker
214*08b48e0bSAndroid Build Coastguard Worker      IS_STARTING=
215*08b48e0bSAndroid Build Coastguard Worker      IS_DEAD=
216*08b48e0bSAndroid Build Coastguard Worker
217*08b48e0bSAndroid Build Coastguard Worker      if [ -e "$i" ] && [ -e "$j" ] && [ -n "$FUSER" ]; then
218*08b48e0bSAndroid Build Coastguard Worker
219*08b48e0bSAndroid Build Coastguard Worker        if [ "$i" -ot "$j" ]; then
220*08b48e0bSAndroid Build Coastguard Worker
221*08b48e0bSAndroid Build Coastguard Worker          # fuzzer_setup is newer than fuzzer_stats, maybe the instance is starting?
222*08b48e0bSAndroid Build Coastguard Worker          TMP_PID=`fuser -v "$DIRECTORY" 2>&1 | grep afl-fuzz`
223*08b48e0bSAndroid Build Coastguard Worker
224*08b48e0bSAndroid Build Coastguard Worker          if [ -n "$TMP_PID" ]; then
225*08b48e0bSAndroid Build Coastguard Worker
226*08b48e0bSAndroid Build Coastguard Worker            if [ "$SUMMARY_ONLY" = "" ]; then
227*08b48e0bSAndroid Build Coastguard Worker
228*08b48e0bSAndroid Build Coastguard Worker              echo "  Instance is still starting up, skipping."
229*08b48e0bSAndroid Build Coastguard Worker              echo
230*08b48e0bSAndroid Build Coastguard Worker
231*08b48e0bSAndroid Build Coastguard Worker            fi
232*08b48e0bSAndroid Build Coastguard Worker
233*08b48e0bSAndroid Build Coastguard Worker            START_CNT=$((START_CNT + 1))
234*08b48e0bSAndroid Build Coastguard Worker            last_find=0
235*08b48e0bSAndroid Build Coastguard Worker            IS_STARTING=1
236*08b48e0bSAndroid Build Coastguard Worker
237*08b48e0bSAndroid Build Coastguard Worker            if [ "$PROCESS_DEAD" = "" ]; then
238*08b48e0bSAndroid Build Coastguard Worker
239*08b48e0bSAndroid Build Coastguard Worker              continue
240*08b48e0bSAndroid Build Coastguard Worker
241*08b48e0bSAndroid Build Coastguard Worker            fi
242*08b48e0bSAndroid Build Coastguard Worker
243*08b48e0bSAndroid Build Coastguard Worker          fi
244*08b48e0bSAndroid Build Coastguard Worker
245*08b48e0bSAndroid Build Coastguard Worker        fi
246*08b48e0bSAndroid Build Coastguard Worker
247*08b48e0bSAndroid Build Coastguard Worker      fi
248*08b48e0bSAndroid Build Coastguard Worker
249*08b48e0bSAndroid Build Coastguard Worker      if [ -z "$IS_STARTING" ]; then
250*08b48e0bSAndroid Build Coastguard Worker
251*08b48e0bSAndroid Build Coastguard Worker        if [ "$SUMMARY_ONLY" = "" ]; then
252*08b48e0bSAndroid Build Coastguard Worker
253*08b48e0bSAndroid Build Coastguard Worker          echo "  Instance is dead or running remotely, skipping."
254*08b48e0bSAndroid Build Coastguard Worker          echo
255*08b48e0bSAndroid Build Coastguard Worker
256*08b48e0bSAndroid Build Coastguard Worker        fi
257*08b48e0bSAndroid Build Coastguard Worker
258*08b48e0bSAndroid Build Coastguard Worker        DEAD_CNT=$((DEAD_CNT + 1))
259*08b48e0bSAndroid Build Coastguard Worker        IS_DEAD=1
260*08b48e0bSAndroid Build Coastguard Worker        last_find=0
261*08b48e0bSAndroid Build Coastguard Worker
262*08b48e0bSAndroid Build Coastguard Worker        if [ "$PROCESS_DEAD" = "" ]; then
263*08b48e0bSAndroid Build Coastguard Worker
264*08b48e0bSAndroid Build Coastguard Worker          continue
265*08b48e0bSAndroid Build Coastguard Worker
266*08b48e0bSAndroid Build Coastguard Worker        fi
267*08b48e0bSAndroid Build Coastguard Worker
268*08b48e0bSAndroid Build Coastguard Worker      fi
269*08b48e0bSAndroid Build Coastguard Worker
270*08b48e0bSAndroid Build Coastguard Worker    fi
271*08b48e0bSAndroid Build Coastguard Worker
272*08b48e0bSAndroid Build Coastguard Worker    ALIVE_CNT=$((ALIVE_CNT + 1))
273*08b48e0bSAndroid Build Coastguard Worker
274*08b48e0bSAndroid Build Coastguard Worker    EXEC_SEC=0
275*08b48e0bSAndroid Build Coastguard Worker    test -z "$RUN_UNIX" -o "$RUN_UNIX" = 0 || EXEC_SEC=$((execs_done / RUN_UNIX))
276*08b48e0bSAndroid Build Coastguard Worker    PATH_PERC=$((cur_item * 100 / corpus_count))
277*08b48e0bSAndroid Build Coastguard Worker
278*08b48e0bSAndroid Build Coastguard Worker    TOTAL_TIME=$((TOTAL_TIME + RUN_UNIX))
279*08b48e0bSAndroid Build Coastguard Worker    TOTAL_EPS=$((TOTAL_EPS + EXEC_SEC))
280*08b48e0bSAndroid Build Coastguard Worker    TOTAL_EXECS=$((TOTAL_EXECS + execs_done))
281*08b48e0bSAndroid Build Coastguard Worker    TOTAL_CRASHES=$((TOTAL_CRASHES + saved_crashes))
282*08b48e0bSAndroid Build Coastguard Worker    TOTAL_HANGS=$((TOTAL_HANGS + saved_hangs))
283*08b48e0bSAndroid Build Coastguard Worker    TOTAL_PENDING=$((TOTAL_PENDING + pending_total))
284*08b48e0bSAndroid Build Coastguard Worker    TOTAL_PFAV=$((TOTAL_PFAV + pending_favs))
285*08b48e0bSAndroid Build Coastguard Worker
286*08b48e0bSAndroid Build Coastguard Worker    if [ "$last_find" -gt "$TOTAL_LAST_FIND" ]; then
287*08b48e0bSAndroid Build Coastguard Worker      TOTAL_LAST_FIND=$last_find
288*08b48e0bSAndroid Build Coastguard Worker    fi
289*08b48e0bSAndroid Build Coastguard Worker
290*08b48e0bSAndroid Build Coastguard Worker    if [ "$SUMMARY_ONLY" = "" ]; then
291*08b48e0bSAndroid Build Coastguard Worker
292*08b48e0bSAndroid Build Coastguard Worker      # Warnings in red
293*08b48e0bSAndroid Build Coastguard Worker      TIMEOUT_PERC=$((exec_timeout * 100 / execs_done))
294*08b48e0bSAndroid Build Coastguard Worker      if [ $TIMEOUT_PERC -ge 10 ]; then
295*08b48e0bSAndroid Build Coastguard Worker        echo "  ${RED}timeout_ratio $TIMEOUT_PERC%${NC}"
296*08b48e0bSAndroid Build Coastguard Worker      fi
297*08b48e0bSAndroid Build Coastguard Worker
298*08b48e0bSAndroid Build Coastguard Worker      if [ $EXEC_SEC -eq 0 ]; then
299*08b48e0bSAndroid Build Coastguard Worker        echo "  ${YELLOW}no data yet, 0 execs/sec${NC}"
300*08b48e0bSAndroid Build Coastguard Worker        elif [ $EXEC_SEC -lt 100 ]; then
301*08b48e0bSAndroid Build Coastguard Worker        echo "  ${RED}slow execution, $EXEC_SEC execs/sec${NC}"
302*08b48e0bSAndroid Build Coastguard Worker      fi
303*08b48e0bSAndroid Build Coastguard Worker
304*08b48e0bSAndroid Build Coastguard Worker      fmt_duration $last_find && FMT_FIND=$DUR_STRING
305*08b48e0bSAndroid Build Coastguard Worker      fmt_duration $last_crash && FMT_CRASH=$DUR_STRING
306*08b48e0bSAndroid Build Coastguard Worker      fmt_duration $last_hang && FMT_HANG=$DUR_STRING
307*08b48e0bSAndroid Build Coastguard Worker      FMT_CWOP="not available"
308*08b48e0bSAndroid Build Coastguard Worker      test -n "$cycles_wo_finds" && {
309*08b48e0bSAndroid Build Coastguard Worker        test "$cycles_wo_finds" = 0 && FMT_CWOP="$cycles_wo_finds"
310*08b48e0bSAndroid Build Coastguard Worker        test "$cycles_wo_finds" -gt 10 && FMT_CWOP="${YELLOW}$cycles_wo_finds${NC}"
311*08b48e0bSAndroid Build Coastguard Worker        test "$cycles_wo_finds" -gt 50 && FMT_CWOP="${RED}$cycles_wo_finds${NC}"
312*08b48e0bSAndroid Build Coastguard Worker      }
313*08b48e0bSAndroid Build Coastguard Worker
314*08b48e0bSAndroid Build Coastguard Worker      echo "  last_find       : $FMT_FIND"
315*08b48e0bSAndroid Build Coastguard Worker      echo "  last_crash      : $FMT_CRASH"
316*08b48e0bSAndroid Build Coastguard Worker      if [ -z "$MINIMAL_ONLY" ]; then
317*08b48e0bSAndroid Build Coastguard Worker        echo "  last_hang       : $FMT_HANG"
318*08b48e0bSAndroid Build Coastguard Worker        echo "  cycles_wo_finds : $FMT_CWOP"
319*08b48e0bSAndroid Build Coastguard Worker      fi
320*08b48e0bSAndroid Build Coastguard Worker      echo "  coverage        : $COVERAGE%"
321*08b48e0bSAndroid Build Coastguard Worker
322*08b48e0bSAndroid Build Coastguard Worker      if [ -z "$MINIMAL_ONLY" ]; then
323*08b48e0bSAndroid Build Coastguard Worker
324*08b48e0bSAndroid Build Coastguard Worker        CPU_USAGE=$(ps aux | grep -w $fuzzer_pid | grep -v grep | awk '{print $3}')
325*08b48e0bSAndroid Build Coastguard Worker        MEM_USAGE=$(ps aux | grep -w $fuzzer_pid | grep -v grep | awk '{print $4}')
326*08b48e0bSAndroid Build Coastguard Worker
327*08b48e0bSAndroid Build Coastguard Worker        echo "  cpu usage $CPU_USAGE%, memory usage $MEM_USAGE%"
328*08b48e0bSAndroid Build Coastguard Worker
329*08b48e0bSAndroid Build Coastguard Worker      fi
330*08b48e0bSAndroid Build Coastguard Worker
331*08b48e0bSAndroid Build Coastguard Worker      echo "  cycles $((cycles_done + 1)), lifetime speed $EXEC_SEC execs/sec, items $cur_item/$corpus_count (${PATH_PERC}%)"
332*08b48e0bSAndroid Build Coastguard Worker
333*08b48e0bSAndroid Build Coastguard Worker      if [ "$saved_crashes" = "0" ]; then
334*08b48e0bSAndroid Build Coastguard Worker        echo "  pending $pending_favs/$pending_total, coverage $bitmap_cvg, no crashes yet"
335*08b48e0bSAndroid Build Coastguard Worker      else
336*08b48e0bSAndroid Build Coastguard Worker        echo "  pending $pending_favs/$pending_total, coverage $bitmap_cvg, crashes saved $saved_crashes (!)"
337*08b48e0bSAndroid Build Coastguard Worker      fi
338*08b48e0bSAndroid Build Coastguard Worker
339*08b48e0bSAndroid Build Coastguard Worker      echo
340*08b48e0bSAndroid Build Coastguard Worker
341*08b48e0bSAndroid Build Coastguard Worker    fi
342*08b48e0bSAndroid Build Coastguard Worker
343*08b48e0bSAndroid Build Coastguard Worker  else
344*08b48e0bSAndroid Build Coastguard Worker
345*08b48e0bSAndroid Build Coastguard Worker    if [ ! -e "$i" -a -e "$j" ]; then
346*08b48e0bSAndroid Build Coastguard Worker
347*08b48e0bSAndroid Build Coastguard Worker      if [ '!' "$PROCESS_DEAD" = "" ]; then
348*08b48e0bSAndroid Build Coastguard Worker        ALIVE_CNT=$((ALIVE_CNT + 1))
349*08b48e0bSAndroid Build Coastguard Worker      fi
350*08b48e0bSAndroid Build Coastguard Worker      START_CNT=$((START_CNT + 1))
351*08b48e0bSAndroid Build Coastguard Worker      last_find=0
352*08b48e0bSAndroid Build Coastguard Worker      IS_STARTING=1
353*08b48e0bSAndroid Build Coastguard Worker
354*08b48e0bSAndroid Build Coastguard Worker    fi
355*08b48e0bSAndroid Build Coastguard Worker
356*08b48e0bSAndroid Build Coastguard Worker  fi
357*08b48e0bSAndroid Build Coastguard Worker
358*08b48e0bSAndroid Build Coastguard Workerdone
359*08b48e0bSAndroid Build Coastguard Worker
360*08b48e0bSAndroid Build Coastguard Worker# Formatting for total time, time since last find, crash, and hang
361*08b48e0bSAndroid Build Coastguard Workerfmt_duration $((CUR_TIME - TOTAL_TIME)) && FMT_TIME=$DUR_STRING
362*08b48e0bSAndroid Build Coastguard Worker# Formatting for total execution
363*08b48e0bSAndroid Build Coastguard WorkerFMT_EXECS="0 millions"
364*08b48e0bSAndroid Build Coastguard WorkerEXECS_MILLION=$((TOTAL_EXECS / 1000 / 1000))
365*08b48e0bSAndroid Build Coastguard WorkerEXECS_THOUSAND=$((TOTAL_EXECS / 1000 % 1000))
366*08b48e0bSAndroid Build Coastguard Workerif [ $EXECS_MILLION -gt 9 ]; then
367*08b48e0bSAndroid Build Coastguard Worker  FMT_EXECS="$EXECS_MILLION millions"
368*08b48e0bSAndroid Build Coastguard Worker  elif [ $EXECS_MILLION -gt 0 ]; then
369*08b48e0bSAndroid Build Coastguard Worker  FMT_EXECS="$EXECS_MILLION millions, $EXECS_THOUSAND thousands"
370*08b48e0bSAndroid Build Coastguard Workerelse
371*08b48e0bSAndroid Build Coastguard Worker  FMT_EXECS="$EXECS_THOUSAND thousands"
372*08b48e0bSAndroid Build Coastguard Workerfi
373*08b48e0bSAndroid Build Coastguard Worker
374*08b48e0bSAndroid Build Coastguard Workerrm -f "$TMP"
375*08b48e0bSAndroid Build Coastguard Worker
376*08b48e0bSAndroid Build Coastguard WorkerTOTAL_DAYS=$((TOTAL_TIME / 60 / 60 / 24))
377*08b48e0bSAndroid Build Coastguard WorkerTOTAL_HRS=$(((TOTAL_TIME / 60 / 60) % 24))
378*08b48e0bSAndroid Build Coastguard Worker
379*08b48e0bSAndroid Build Coastguard Workertest -z "$TOTAL_WCOP" && TOTAL_WCOP="not available"
380*08b48e0bSAndroid Build Coastguard Workerfmt_duration $TOTAL_LAST_FIND && TOTAL_LAST_FIND=$DUR_STRING
381*08b48e0bSAndroid Build Coastguard Worker
382*08b48e0bSAndroid Build Coastguard Workertest "$TOTAL_TIME" = "0" && TOTAL_TIME=1
383*08b48e0bSAndroid Build Coastguard Worker
384*08b48e0bSAndroid Build Coastguard Workerif [ "$PROCESS_DEAD" = "" ]; then
385*08b48e0bSAndroid Build Coastguard Worker
386*08b48e0bSAndroid Build Coastguard Worker  TXT="excluded from stats"
387*08b48e0bSAndroid Build Coastguard Worker
388*08b48e0bSAndroid Build Coastguard Workerelse
389*08b48e0bSAndroid Build Coastguard Worker
390*08b48e0bSAndroid Build Coastguard Worker  TXT="included in stats"
391*08b48e0bSAndroid Build Coastguard Worker  ALIVE_CNT=$(($ALIVE_CNT - $DEAD_CNT - $START_CNT))
392*08b48e0bSAndroid Build Coastguard Worker
393*08b48e0bSAndroid Build Coastguard Workerfi
394*08b48e0bSAndroid Build Coastguard Worker
395*08b48e0bSAndroid Build Coastguard Workerecho "Summary stats"
396*08b48e0bSAndroid Build Coastguard Workerecho "============="
397*08b48e0bSAndroid Build Coastguard Workerif [ -z "$SUMMARY_ONLY" -o -z "$MINIMAL_ONLY" ]; then
398*08b48e0bSAndroid Build Coastguard Worker  echo
399*08b48e0bSAndroid Build Coastguard Workerfi
400*08b48e0bSAndroid Build Coastguard Worker
401*08b48e0bSAndroid Build Coastguard Workerecho "       Fuzzers alive : $ALIVE_CNT"
402*08b48e0bSAndroid Build Coastguard Worker
403*08b48e0bSAndroid Build Coastguard Workerif [ ! "$START_CNT" = "0" ]; then
404*08b48e0bSAndroid Build Coastguard Worker  echo "         Starting up : $START_CNT ($TXT)"
405*08b48e0bSAndroid Build Coastguard Workerfi
406*08b48e0bSAndroid Build Coastguard Worker
407*08b48e0bSAndroid Build Coastguard Workerif [ ! "$DEAD_CNT" = "0" ]; then
408*08b48e0bSAndroid Build Coastguard Worker  echo "      Dead or remote : $DEAD_CNT ($TXT)"
409*08b48e0bSAndroid Build Coastguard Workerfi
410*08b48e0bSAndroid Build Coastguard Worker
411*08b48e0bSAndroid Build Coastguard Workerecho "      Total run time : $FMT_TIME"
412*08b48e0bSAndroid Build Coastguard Workerif [ -z "$MINIMAL_ONLY" ]; then
413*08b48e0bSAndroid Build Coastguard Worker  echo "         Total execs : $FMT_EXECS"
414*08b48e0bSAndroid Build Coastguard Worker  echo "    Cumulative speed : $TOTAL_EPS execs/sec"
415*08b48e0bSAndroid Build Coastguard Workerfi
416*08b48e0bSAndroid Build Coastguard Workerif [ "$ALIVE_CNT" -gt "0" ]; then
417*08b48e0bSAndroid Build Coastguard Worker  echo "       Average speed : $((TOTAL_EPS / ALIVE_CNT)) execs/sec"
418*08b48e0bSAndroid Build Coastguard Workerfi
419*08b48e0bSAndroid Build Coastguard Workerif [ -z "$MINIMAL_ONLY" ]; then
420*08b48e0bSAndroid Build Coastguard Worker  echo "       Pending items : $TOTAL_PFAV faves, $TOTAL_PENDING total"
421*08b48e0bSAndroid Build Coastguard Workerfi
422*08b48e0bSAndroid Build Coastguard Worker
423*08b48e0bSAndroid Build Coastguard Workerif [ "$ALIVE_CNT" -gt "1" -o -n "$MINIMAL_ONLY" ]; then
424*08b48e0bSAndroid Build Coastguard Worker  if [ "$ALIVE_CNT" -gt "0" ]; then
425*08b48e0bSAndroid Build Coastguard Worker    echo "  Pending per fuzzer : $((TOTAL_PFAV/ALIVE_CNT)) faves, $((TOTAL_PENDING/ALIVE_CNT)) total (on average)"
426*08b48e0bSAndroid Build Coastguard Worker  fi
427*08b48e0bSAndroid Build Coastguard Workerfi
428*08b48e0bSAndroid Build Coastguard Worker
429*08b48e0bSAndroid Build Coastguard Workerecho "    Coverage reached : ${TOTAL_COVERAGE}%"
430*08b48e0bSAndroid Build Coastguard Workerecho "       Crashes saved : $TOTAL_CRASHES"
431*08b48e0bSAndroid Build Coastguard Workerif [ -z "$MINIMAL_ONLY" ]; then
432*08b48e0bSAndroid Build Coastguard Worker  echo "         Hangs saved : $TOTAL_HANGS"
433*08b48e0bSAndroid Build Coastguard Worker  echo "Cycles without finds : $TOTAL_WCOP"
434*08b48e0bSAndroid Build Coastguard Workerfi
435*08b48e0bSAndroid Build Coastguard Workerecho "  Time without finds : $TOTAL_LAST_FIND"
436*08b48e0bSAndroid Build Coastguard Workerecho
437*08b48e0bSAndroid Build Coastguard Worker
438*08b48e0bSAndroid Build Coastguard Workerexit 0
439