xref: /aosp_15_r20/external/AFLplusplus/afl-plot (revision 08b48e0b10e97b33e7b60c5b6e2243bd915777f2)
1*08b48e0bSAndroid Build Coastguard Worker#!/bin/sh
2*08b48e0bSAndroid Build Coastguard Worker#
3*08b48e0bSAndroid Build Coastguard Worker# american fuzzy lop++ - Advanced Persistent Graphing
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# Based on a design & prototype by Michael Rash.
8*08b48e0bSAndroid Build Coastguard Worker#
9*08b48e0bSAndroid Build Coastguard Worker# Copyright 2014, 2015 Google Inc. 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
18*08b48e0bSAndroid Build Coastguard Workerget_abs_path() {
19*08b48e0bSAndroid Build Coastguard Worker  echo $(cd "`dirname "$1"`" && pwd)/"`basename "$1"`"
20*08b48e0bSAndroid Build Coastguard Worker}
21*08b48e0bSAndroid Build Coastguard Worker
22*08b48e0bSAndroid Build Coastguard Workerecho "progress plotting utility for afl-fuzz by Michal Zalewski"
23*08b48e0bSAndroid Build Coastguard Workerecho
24*08b48e0bSAndroid Build Coastguard Worker
25*08b48e0bSAndroid Build Coastguard WorkerGRAPHICAL="0"
26*08b48e0bSAndroid Build Coastguard Worker
27*08b48e0bSAndroid Build Coastguard Workerif [ "$1"  = "-g" ] || [ "$1" = "--graphical" ]; then
28*08b48e0bSAndroid Build Coastguard WorkerGRAPHICAL="1"
29*08b48e0bSAndroid Build Coastguard Workershift
30*08b48e0bSAndroid Build Coastguard Workerfi
31*08b48e0bSAndroid Build Coastguard Worker
32*08b48e0bSAndroid Build Coastguard Workerif [ "$#" != "2" ]; then
33*08b48e0bSAndroid Build Coastguard Worker
34*08b48e0bSAndroid Build Coastguard Worker  cat 1>&2 <<_EOF_
35*08b48e0bSAndroid Build Coastguard Worker$0 [ -g | --graphical ] afl_state_dir graph_output_dir
36*08b48e0bSAndroid Build Coastguard Worker
37*08b48e0bSAndroid Build Coastguard WorkerThis program generates gnuplot images from afl-fuzz output data.
38*08b48e0bSAndroid Build Coastguard Worker
39*08b48e0bSAndroid Build Coastguard WorkerUsage:
40*08b48e0bSAndroid Build Coastguard Worker
41*08b48e0bSAndroid Build Coastguard Worker    afl_state_dir       should point to an existing state directory for any
42*08b48e0bSAndroid Build Coastguard Worker                        active or stopped instance of afl-fuzz
43*08b48e0bSAndroid Build Coastguard Worker    graph_output_dir    should point to an empty directory where this
44*08b48e0bSAndroid Build Coastguard Worker                        tool can write the resulting plots to
45*08b48e0bSAndroid Build Coastguard Worker    -g, --graphical     (optional) display the plots in a graphical window
46*08b48e0bSAndroid Build Coastguard Worker                        (you should have built afl-plot-ui to use this option)
47*08b48e0bSAndroid Build Coastguard Worker
48*08b48e0bSAndroid Build Coastguard WorkerThe program will put index.html and three PNG images in the output directory;
49*08b48e0bSAndroid Build Coastguard Workeryou should be able to view it with any web browser of your choice.
50*08b48e0bSAndroid Build Coastguard Worker_EOF_
51*08b48e0bSAndroid Build Coastguard Worker
52*08b48e0bSAndroid Build Coastguard Worker  exit 1
53*08b48e0bSAndroid Build Coastguard Worker
54*08b48e0bSAndroid Build Coastguard Workerfi
55*08b48e0bSAndroid Build Coastguard Worker
56*08b48e0bSAndroid Build Coastguard Workerinputdir=`get_abs_path "$1"`
57*08b48e0bSAndroid Build Coastguard Workeroutputdir=`get_abs_path "$2"`
58*08b48e0bSAndroid Build Coastguard Worker
59*08b48e0bSAndroid Build Coastguard Worker#if [ "$AFL_ALLOW_TMP" = "" ]; then
60*08b48e0bSAndroid Build Coastguard Worker#
61*08b48e0bSAndroid Build Coastguard Worker#  echo "$inputdir" | grep -qE '^(/var)?/tmp/'
62*08b48e0bSAndroid Build Coastguard Worker#  T1="$?"
63*08b48e0bSAndroid Build Coastguard Worker#
64*08b48e0bSAndroid Build Coastguard Worker#  echo "$outputdir" | grep -qE '^(/var)?/tmp/'
65*08b48e0bSAndroid Build Coastguard Worker#  T2="$?"
66*08b48e0bSAndroid Build Coastguard Worker#
67*08b48e0bSAndroid Build Coastguard Worker#  if [ "$T1" = "0" -o "$T2" = "0" ]; then
68*08b48e0bSAndroid Build Coastguard Worker#
69*08b48e0bSAndroid Build Coastguard Worker#    echo "[-] Error: this script shouldn't be used with shared /tmp directories." 1>&2
70*08b48e0bSAndroid Build Coastguard Worker#    exit 1
71*08b48e0bSAndroid Build Coastguard Worker#
72*08b48e0bSAndroid Build Coastguard Worker#  fi
73*08b48e0bSAndroid Build Coastguard Worker#
74*08b48e0bSAndroid Build Coastguard Worker#fi
75*08b48e0bSAndroid Build Coastguard Worker
76*08b48e0bSAndroid Build Coastguard Workerif [ ! -f "$inputdir/plot_data" ]; then
77*08b48e0bSAndroid Build Coastguard Worker
78*08b48e0bSAndroid Build Coastguard Worker  if [ -f "$inputdir/default/plot_data" ]; then
79*08b48e0bSAndroid Build Coastguard Worker
80*08b48e0bSAndroid Build Coastguard Worker    echo "[-] Error: input directory is not valid (missing 'plot_data'), likely you mean $inputdir/default?" 1>&2
81*08b48e0bSAndroid Build Coastguard Worker    exit 1
82*08b48e0bSAndroid Build Coastguard Worker
83*08b48e0bSAndroid Build Coastguard Worker  else
84*08b48e0bSAndroid Build Coastguard Worker
85*08b48e0bSAndroid Build Coastguard Worker    echo "[-] Error: input directory is not valid (missing 'plot_data')." 1>&2
86*08b48e0bSAndroid Build Coastguard Worker    exit 1
87*08b48e0bSAndroid Build Coastguard Worker
88*08b48e0bSAndroid Build Coastguard Worker  fi
89*08b48e0bSAndroid Build Coastguard Worker
90*08b48e0bSAndroid Build Coastguard Workerfi
91*08b48e0bSAndroid Build Coastguard Worker
92*08b48e0bSAndroid Build Coastguard WorkerLINES=`cat "$inputdir/plot_data" | wc -l`
93*08b48e0bSAndroid Build Coastguard Worker
94*08b48e0bSAndroid Build Coastguard Workerif [ "$LINES" -lt 3 ]; then
95*08b48e0bSAndroid Build Coastguard Worker
96*08b48e0bSAndroid Build Coastguard Worker  echo "[-] Error: plot_data carries too little data, let it run longer." 1>&2
97*08b48e0bSAndroid Build Coastguard Worker  exit 1
98*08b48e0bSAndroid Build Coastguard Worker
99*08b48e0bSAndroid Build Coastguard Workerfi
100*08b48e0bSAndroid Build Coastguard Worker
101*08b48e0bSAndroid Build Coastguard WorkerBANNER="`cat "$inputdir/fuzzer_stats" 2> /dev/null | grep '^afl_banner ' | cut -d: -f2- | cut -b2-`"
102*08b48e0bSAndroid Build Coastguard Worker
103*08b48e0bSAndroid Build Coastguard Workertest "$BANNER" = "" && BANNER="(none)"
104*08b48e0bSAndroid Build Coastguard Worker
105*08b48e0bSAndroid Build Coastguard WorkerGNUPLOT=`command -v gnuplot 2>/dev/null`
106*08b48e0bSAndroid Build Coastguard Worker
107*08b48e0bSAndroid Build Coastguard Workerif [ "$GNUPLOT" = "" ]; then
108*08b48e0bSAndroid Build Coastguard Worker
109*08b48e0bSAndroid Build Coastguard Worker  echo "[-] Error: can't find 'gnuplot' in your \$PATH." 1>&2
110*08b48e0bSAndroid Build Coastguard Worker  exit 1
111*08b48e0bSAndroid Build Coastguard Worker
112*08b48e0bSAndroid Build Coastguard Workerfi
113*08b48e0bSAndroid Build Coastguard Worker
114*08b48e0bSAndroid Build Coastguard Workermkdir "$outputdir" 2>/dev/null
115*08b48e0bSAndroid Build Coastguard Worker
116*08b48e0bSAndroid Build Coastguard Workerif [ ! -d "$outputdir" ]; then
117*08b48e0bSAndroid Build Coastguard Worker
118*08b48e0bSAndroid Build Coastguard Worker  echo "[-] Error: unable to create the output directory - pick another location." 1>&2
119*08b48e0bSAndroid Build Coastguard Worker  exit 1
120*08b48e0bSAndroid Build Coastguard Worker
121*08b48e0bSAndroid Build Coastguard Workerfi
122*08b48e0bSAndroid Build Coastguard Worker
123*08b48e0bSAndroid Build Coastguard Workerrm -f "$outputdir/high_freq.png" "$outputdir/low_freq.png" "$outputdir/exec_speed.png" "$outputdir/edges.png"
124*08b48e0bSAndroid Build Coastguard Workermv -f "$outputdir/index.html" "$outputdir/index.html.orig" 2>/dev/null
125*08b48e0bSAndroid Build Coastguard Worker
126*08b48e0bSAndroid Build Coastguard WorkerGNUPLOT_SETUP="
127*08b48e0bSAndroid Build Coastguard Worker#set xdata time
128*08b48e0bSAndroid Build Coastguard Worker#set timefmt '%s'
129*08b48e0bSAndroid Build Coastguard Worker#set format x \"%b %d\n%H:%M\"
130*08b48e0bSAndroid Build Coastguard Workerset tics font 'small'
131*08b48e0bSAndroid Build Coastguard Workerunset mxtics
132*08b48e0bSAndroid Build Coastguard Workerunset mytics
133*08b48e0bSAndroid Build Coastguard Worker
134*08b48e0bSAndroid Build Coastguard Workerset grid xtics linetype 0 linecolor rgb '#e0e0e0'
135*08b48e0bSAndroid Build Coastguard Workerset grid ytics linetype 0 linecolor rgb '#e0e0e0'
136*08b48e0bSAndroid Build Coastguard Workerset border linecolor rgb '#50c0f0'
137*08b48e0bSAndroid Build Coastguard Workerset tics textcolor rgb '#000000'
138*08b48e0bSAndroid Build Coastguard Workerset key outside
139*08b48e0bSAndroid Build Coastguard Worker
140*08b48e0bSAndroid Build Coastguard Workerset autoscale xfixmin
141*08b48e0bSAndroid Build Coastguard Workerset autoscale xfixmax
142*08b48e0bSAndroid Build Coastguard Worker
143*08b48e0bSAndroid Build Coastguard Workerset xlabel \"relative time in seconds\" font \"small\"
144*08b48e0bSAndroid Build Coastguard Worker"
145*08b48e0bSAndroid Build Coastguard Worker
146*08b48e0bSAndroid Build Coastguard WorkerPLOT_HF="
147*08b48e0bSAndroid Build Coastguard Workerset terminal png truecolor enhanced size 1000,300 butt
148*08b48e0bSAndroid Build Coastguard Workerset output '$outputdir/high_freq.png'
149*08b48e0bSAndroid Build Coastguard Worker
150*08b48e0bSAndroid Build Coastguard Worker$GNUPLOT_SETUP
151*08b48e0bSAndroid Build Coastguard Worker
152*08b48e0bSAndroid Build Coastguard Workerplot '$inputdir/plot_data' using 1:4 with filledcurve x1 title 'corpus count' linecolor rgb '#000000' fillstyle transparent solid 0.2 noborder, \\
153*08b48e0bSAndroid Build Coastguard Worker     '' using 1:3 with filledcurve x1 title 'current item' linecolor rgb '#f0f0f0' fillstyle transparent solid 0.5 noborder, \\
154*08b48e0bSAndroid Build Coastguard Worker     '' using 1:5 with lines title 'pending items' linecolor rgb '#0090ff' linewidth 3, \\
155*08b48e0bSAndroid Build Coastguard Worker     '' using 1:6 with lines title 'pending favs' linecolor rgb '#c00080' linewidth 3, \\
156*08b48e0bSAndroid Build Coastguard Worker     '' using 1:2 with lines title 'cycles done' linecolor rgb '#c000f0' linewidth 3
157*08b48e0bSAndroid Build Coastguard Worker"
158*08b48e0bSAndroid Build Coastguard Worker
159*08b48e0bSAndroid Build Coastguard WorkerPLOT_LF="
160*08b48e0bSAndroid Build Coastguard Workerset terminal png truecolor enhanced size 1000,200 butt
161*08b48e0bSAndroid Build Coastguard Workerset output '$outputdir/low_freq.png'
162*08b48e0bSAndroid Build Coastguard Worker
163*08b48e0bSAndroid Build Coastguard Worker$GNUPLOT_SETUP
164*08b48e0bSAndroid Build Coastguard Worker
165*08b48e0bSAndroid Build Coastguard Workerplot '$inputdir/plot_data' using 1:8 with filledcurve x1 title '' linecolor rgb '#c00080' fillstyle transparent solid 0.2 noborder, \\
166*08b48e0bSAndroid Build Coastguard Worker     '' using 1:8 with lines title ' uniq crashes' linecolor rgb '#c00080' linewidth 3, \\
167*08b48e0bSAndroid Build Coastguard Worker     '' using 1:9 with lines title 'uniq hangs' linecolor rgb '#c000f0' linewidth 3, \\
168*08b48e0bSAndroid Build Coastguard Worker     '' using 1:10 with lines title 'levels' linecolor rgb '#0090ff' linewidth 3
169*08b48e0bSAndroid Build Coastguard Worker"
170*08b48e0bSAndroid Build Coastguard Worker
171*08b48e0bSAndroid Build Coastguard WorkerPLOT_ES="
172*08b48e0bSAndroid Build Coastguard Workerset terminal png truecolor enhanced size 1000,200 butt
173*08b48e0bSAndroid Build Coastguard Workerset output '$outputdir/exec_speed.png'
174*08b48e0bSAndroid Build Coastguard Worker
175*08b48e0bSAndroid Build Coastguard Worker$GNUPLOT_SETUP
176*08b48e0bSAndroid Build Coastguard Worker
177*08b48e0bSAndroid Build Coastguard Workerplot '$inputdir/plot_data' using 1:11 with filledcurve x1 title '' linecolor rgb '#0090ff' fillstyle transparent solid 0.2 noborder, \\
178*08b48e0bSAndroid Build Coastguard Worker     '$inputdir/plot_data' using 1:11 with lines title '    execs/sec' linecolor rgb '#0090ff' linewidth 3 smooth bezier;
179*08b48e0bSAndroid Build Coastguard Worker"
180*08b48e0bSAndroid Build Coastguard Worker
181*08b48e0bSAndroid Build Coastguard WorkerPLOT_EG="
182*08b48e0bSAndroid Build Coastguard Workerset terminal png truecolor enhanced size 1000,300 butt
183*08b48e0bSAndroid Build Coastguard Workerset output '$outputdir/edges.png'
184*08b48e0bSAndroid Build Coastguard Worker
185*08b48e0bSAndroid Build Coastguard Worker$GNUPLOT_SETUP
186*08b48e0bSAndroid Build Coastguard Worker
187*08b48e0bSAndroid Build Coastguard Workerplot '$inputdir/plot_data' using 1:13 with lines title '        edges' linecolor rgb '#0090ff' linewidth 3
188*08b48e0bSAndroid Build Coastguard Worker"
189*08b48e0bSAndroid Build Coastguard Worker
190*08b48e0bSAndroid Build Coastguard Workerif [ "$#" = "2" ] && [ "$GRAPHICAL" = "1" ]; then
191*08b48e0bSAndroid Build Coastguard Worker
192*08b48e0bSAndroid Build Coastguard Workerafl-plot-ui -h > /dev/null 2>&1
193*08b48e0bSAndroid Build Coastguard Worker
194*08b48e0bSAndroid Build Coastguard Workerif [ "$?" != "0" ]; then
195*08b48e0bSAndroid Build Coastguard Worker
196*08b48e0bSAndroid Build Coastguard Workercat 1>&2 <<_EOF_
197*08b48e0bSAndroid Build Coastguard WorkerYou do not seem to have the afl-plot-ui utility installed. If you have installed afl-plot-ui, make sure the afl-plot-ui executable is in your PATH.
198*08b48e0bSAndroid Build Coastguard WorkerIf you are still facing any problems, please open an issue at https://github.com/AFLplusplus/AFLplusplus/issues.
199*08b48e0bSAndroid Build Coastguard Worker
200*08b48e0bSAndroid Build Coastguard WorkerNo plots have been generated. Please rerun without the "-g" or "--graphical" flag to generate the plots.
201*08b48e0bSAndroid Build Coastguard Worker_EOF_
202*08b48e0bSAndroid Build Coastguard Worker
203*08b48e0bSAndroid Build Coastguard Workerexit 1
204*08b48e0bSAndroid Build Coastguard Worker
205*08b48e0bSAndroid Build Coastguard Workerfi
206*08b48e0bSAndroid Build Coastguard Worker
207*08b48e0bSAndroid Build Coastguard Workerrm -rf "$outputdir/.tmp"
208*08b48e0bSAndroid Build Coastguard Workermkdir -p "$outputdir/.tmp"
209*08b48e0bSAndroid Build Coastguard Workermkfifo "$outputdir/.tmp/win_ids" || exit 1
210*08b48e0bSAndroid Build Coastguard Worker
211*08b48e0bSAndroid Build Coastguard Workerafl-plot-ui > "$outputdir/.tmp/win_ids" &
212*08b48e0bSAndroid Build Coastguard WorkerW_IDS=$(cat "$outputdir/.tmp/win_ids")
213*08b48e0bSAndroid Build Coastguard Worker
214*08b48e0bSAndroid Build Coastguard Workerrm -rf "$outputdir/.tmp"
215*08b48e0bSAndroid Build Coastguard Worker
216*08b48e0bSAndroid Build Coastguard WorkerW_ID1=$(echo "$W_IDS" | head -n 1)
217*08b48e0bSAndroid Build Coastguard WorkerW_ID2=$(echo "$W_IDS" | head -n 2 | tail -n 1)
218*08b48e0bSAndroid Build Coastguard WorkerW_ID3=$(echo "$W_IDS" | head -n 3 | tail -n 1)
219*08b48e0bSAndroid Build Coastguard WorkerW_ID4=$(echo "$W_IDS" | tail -n 1)
220*08b48e0bSAndroid Build Coastguard Worker
221*08b48e0bSAndroid Build Coastguard Workerecho "[*] Generating plots..."
222*08b48e0bSAndroid Build Coastguard Worker
223*08b48e0bSAndroid Build Coastguard Worker(
224*08b48e0bSAndroid Build Coastguard Worker
225*08b48e0bSAndroid Build Coastguard Workercat << _EOF_
226*08b48e0bSAndroid Build Coastguard Worker
227*08b48e0bSAndroid Build Coastguard Worker$PLOT_HF
228*08b48e0bSAndroid Build Coastguard Workerset term x11 window "$W_ID3"
229*08b48e0bSAndroid Build Coastguard Workerset output
230*08b48e0bSAndroid Build Coastguard Workerreplot
231*08b48e0bSAndroid Build Coastguard Workerpause mouse close
232*08b48e0bSAndroid Build Coastguard Worker
233*08b48e0bSAndroid Build Coastguard Worker_EOF_
234*08b48e0bSAndroid Build Coastguard Worker
235*08b48e0bSAndroid Build Coastguard Worker) | gnuplot 2> /dev/null &
236*08b48e0bSAndroid Build Coastguard Worker
237*08b48e0bSAndroid Build Coastguard Worker(
238*08b48e0bSAndroid Build Coastguard Worker
239*08b48e0bSAndroid Build Coastguard Workercat << _EOF_
240*08b48e0bSAndroid Build Coastguard Worker
241*08b48e0bSAndroid Build Coastguard Worker$PLOT_LF
242*08b48e0bSAndroid Build Coastguard Workerset term x11 window "$W_ID4"
243*08b48e0bSAndroid Build Coastguard Workerset output
244*08b48e0bSAndroid Build Coastguard Workerreplot
245*08b48e0bSAndroid Build Coastguard Workerpause mouse close
246*08b48e0bSAndroid Build Coastguard Worker
247*08b48e0bSAndroid Build Coastguard Worker_EOF_
248*08b48e0bSAndroid Build Coastguard Worker
249*08b48e0bSAndroid Build Coastguard Worker) | gnuplot 2> /dev/null &
250*08b48e0bSAndroid Build Coastguard Worker
251*08b48e0bSAndroid Build Coastguard Worker(
252*08b48e0bSAndroid Build Coastguard Worker
253*08b48e0bSAndroid Build Coastguard Workercat << _EOF_
254*08b48e0bSAndroid Build Coastguard Worker
255*08b48e0bSAndroid Build Coastguard Worker$PLOT_ES
256*08b48e0bSAndroid Build Coastguard Workerset term x11 window "$W_ID2"
257*08b48e0bSAndroid Build Coastguard Workerset output
258*08b48e0bSAndroid Build Coastguard Workerreplot
259*08b48e0bSAndroid Build Coastguard Workerpause mouse close
260*08b48e0bSAndroid Build Coastguard Worker
261*08b48e0bSAndroid Build Coastguard Worker_EOF_
262*08b48e0bSAndroid Build Coastguard Worker
263*08b48e0bSAndroid Build Coastguard Worker) | gnuplot 2> /dev/null &
264*08b48e0bSAndroid Build Coastguard Worker
265*08b48e0bSAndroid Build Coastguard Worker(
266*08b48e0bSAndroid Build Coastguard Worker
267*08b48e0bSAndroid Build Coastguard Workercat << _EOF_
268*08b48e0bSAndroid Build Coastguard Worker
269*08b48e0bSAndroid Build Coastguard Worker$PLOT_EG
270*08b48e0bSAndroid Build Coastguard Workerset term x11 window "$W_ID1"
271*08b48e0bSAndroid Build Coastguard Workerset output
272*08b48e0bSAndroid Build Coastguard Workerreplot
273*08b48e0bSAndroid Build Coastguard Workerpause mouse close
274*08b48e0bSAndroid Build Coastguard Worker
275*08b48e0bSAndroid Build Coastguard Worker_EOF_
276*08b48e0bSAndroid Build Coastguard Worker
277*08b48e0bSAndroid Build Coastguard Worker) | gnuplot 2> /dev/null &
278*08b48e0bSAndroid Build Coastguard Worker
279*08b48e0bSAndroid Build Coastguard Workersleep 1
280*08b48e0bSAndroid Build Coastguard Worker
281*08b48e0bSAndroid Build Coastguard Workerelse
282*08b48e0bSAndroid Build Coastguard Worker
283*08b48e0bSAndroid Build Coastguard Workerecho "[*] Generating plots..."
284*08b48e0bSAndroid Build Coastguard Worker
285*08b48e0bSAndroid Build Coastguard Worker(
286*08b48e0bSAndroid Build Coastguard Worker
287*08b48e0bSAndroid Build Coastguard Workercat << _EOF_
288*08b48e0bSAndroid Build Coastguard Worker
289*08b48e0bSAndroid Build Coastguard Worker$PLOT_HF
290*08b48e0bSAndroid Build Coastguard Worker
291*08b48e0bSAndroid Build Coastguard Worker$PLOT_LF
292*08b48e0bSAndroid Build Coastguard Worker
293*08b48e0bSAndroid Build Coastguard Worker$PLOT_ES
294*08b48e0bSAndroid Build Coastguard Worker
295*08b48e0bSAndroid Build Coastguard Worker$PLOT_EG
296*08b48e0bSAndroid Build Coastguard Worker
297*08b48e0bSAndroid Build Coastguard Worker_EOF_
298*08b48e0bSAndroid Build Coastguard Worker
299*08b48e0bSAndroid Build Coastguard Worker) | gnuplot || echo "Note: if you see errors concerning 'unknown or ambiguous terminal type' then you need to use a gnuplot that has png support compiled in."
300*08b48e0bSAndroid Build Coastguard Worker
301*08b48e0bSAndroid Build Coastguard Workerecho "[?] You can also use -g flag to view the plots in an GUI window, and interact with the plots (if you have built afl-plot-ui). Run \"afl-plot -h\" to know more."
302*08b48e0bSAndroid Build Coastguard Worker
303*08b48e0bSAndroid Build Coastguard Workerfi
304*08b48e0bSAndroid Build Coastguard Worker
305*08b48e0bSAndroid Build Coastguard Workerif [ ! -s "$outputdir/exec_speed.png" ]; then
306*08b48e0bSAndroid Build Coastguard Worker
307*08b48e0bSAndroid Build Coastguard Worker  echo "[-] Error: something went wrong! Perhaps you have an ancient version of gnuplot?" 1>&2
308*08b48e0bSAndroid Build Coastguard Worker  exit 1
309*08b48e0bSAndroid Build Coastguard Worker
310*08b48e0bSAndroid Build Coastguard Workerfi
311*08b48e0bSAndroid Build Coastguard Worker
312*08b48e0bSAndroid Build Coastguard Workerecho "[*] Generating index.html..."
313*08b48e0bSAndroid Build Coastguard Worker
314*08b48e0bSAndroid Build Coastguard Workercat >"$outputdir/index.html" <<_EOF_
315*08b48e0bSAndroid Build Coastguard Worker<table style="font-family: 'Trebuchet MS', 'Tahoma', 'Arial', 'Helvetica'">
316*08b48e0bSAndroid Build Coastguard Worker<tr><td style="width: 18ex"><b>Banner:</b></td><td>$BANNER</td></tr>
317*08b48e0bSAndroid Build Coastguard Worker<tr><td><b>Directory:</b></td><td>$inputdir</td></tr>
318*08b48e0bSAndroid Build Coastguard Worker<tr><td><b>Generated on:</b></td><td>`date`</td></tr>
319*08b48e0bSAndroid Build Coastguard Worker</table>
320*08b48e0bSAndroid Build Coastguard Worker<p>
321*08b48e0bSAndroid Build Coastguard Worker<img src="edges.png" width=1000 height=300>
322*08b48e0bSAndroid Build Coastguard Worker<img src="high_freq.png" width=1000 height=300><p>
323*08b48e0bSAndroid Build Coastguard Worker<img src="low_freq.png" width=1000 height=200><p>
324*08b48e0bSAndroid Build Coastguard Worker<img src="exec_speed.png" width=1000 height=200>
325*08b48e0bSAndroid Build Coastguard Worker
326*08b48e0bSAndroid Build Coastguard Worker_EOF_
327*08b48e0bSAndroid Build Coastguard Worker
328*08b48e0bSAndroid Build Coastguard Worker# Make it easy to remotely view results when outputting directly to a directory
329*08b48e0bSAndroid Build Coastguard Worker# served by Apache or other HTTP daemon. Since the plots aren't horribly
330*08b48e0bSAndroid Build Coastguard Worker# sensitive, this seems like a reasonable trade-off.
331*08b48e0bSAndroid Build Coastguard Worker
332*08b48e0bSAndroid Build Coastguard Workerchmod 755 "$outputdir"
333*08b48e0bSAndroid Build Coastguard Workerchmod 644 "$outputdir/high_freq.png" "$outputdir/low_freq.png" "$outputdir/exec_speed.png" "$outputdir/edges.png" "$outputdir/index.html"
334*08b48e0bSAndroid Build Coastguard Worker
335*08b48e0bSAndroid Build Coastguard Workerecho "[+] All done - enjoy your charts!"
336*08b48e0bSAndroid Build Coastguard Worker
337*08b48e0bSAndroid Build Coastguard Workerexit 0
338