1*c8dee2aaSAndroid Build Coastguard Worker#!/bin/sh 2*c8dee2aaSAndroid Build Coastguard Worker# Copyright 2017 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker# 4*c8dee2aaSAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker# found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker 7*c8dee2aaSAndroid Build Coastguard Workerif [ -z "$1" ]; then 8*c8dee2aaSAndroid Build Coastguard Worker cat <<-EOM 9*c8dee2aaSAndroid Build Coastguard Worker Usage: 10*c8dee2aaSAndroid Build Coastguard Worker $0 [afl-out-loc] 11*c8dee2aaSAndroid Build Coastguard Worker 12*c8dee2aaSAndroid Build Coastguard Worker Run something like this: 13*c8dee2aaSAndroid Build Coastguard Worker $0 ~/afl-out 14*c8dee2aaSAndroid Build Coastguard Worker where afl-out is the directory containing all the output of the afl-fuzzers. 15*c8dee2aaSAndroid Build Coastguard Worker You can typically ssh into skia-fuzzer-be-1 and skia-fuzzer-be-2 and run 16*c8dee2aaSAndroid Build Coastguard Worker tar -czf afl-out.tar.gz /mnt/ssd0/fuzzes/afl-out/*/fuzzer0/queue 17*c8dee2aaSAndroid Build Coastguard Worker and extract it locally to get the directories needed to assess coverage. 18*c8dee2aaSAndroid Build Coastguard Worker 19*c8dee2aaSAndroid Build Coastguard Worker EOM 20*c8dee2aaSAndroid Build Coastguard Worker exit 1 21*c8dee2aaSAndroid Build Coastguard Workerfi 22*c8dee2aaSAndroid Build Coastguard Worker 23*c8dee2aaSAndroid Build Coastguard Workerset -x 24*c8dee2aaSAndroid Build Coastguard Workerset -e 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Workercd "$(dirname "$0")/.." 27*c8dee2aaSAndroid Build Coastguard Worker 28*c8dee2aaSAndroid Build Coastguard WorkerEXECUTABLE="fuzz" 29*c8dee2aaSAndroid Build Coastguard Worker 30*c8dee2aaSAndroid Build Coastguard WorkerDIR="$(mktemp -d "${TMPDIR:-/tmp}/skia_coverage_XXXXXXXXXX")" 31*c8dee2aaSAndroid Build Coastguard WorkerBUILD=out/coverage 32*c8dee2aaSAndroid Build Coastguard Worker 33*c8dee2aaSAndroid Build Coastguard Worker# Build $EXECUTABLE 34*c8dee2aaSAndroid Build Coastguard Workerbin/sync 35*c8dee2aaSAndroid Build Coastguard Workerbin/fetch-gn 36*c8dee2aaSAndroid Build Coastguard Worker 37*c8dee2aaSAndroid Build Coastguard Workerrm -rf $BUILD 38*c8dee2aaSAndroid Build Coastguard Worker 39*c8dee2aaSAndroid Build Coastguard Worker#TODO: make this work with Clang. 40*c8dee2aaSAndroid Build Coastguard WorkerARGS='cc="gcc" cxx="g++" extra_cflags=["--coverage"] extra_ldflags=["--coverage"]' 41*c8dee2aaSAndroid Build Coastguard Workergn gen --args="$ARGS" "$BUILD" 42*c8dee2aaSAndroid Build Coastguard Worker 43*c8dee2aaSAndroid Build Coastguard Workerninja -C "$BUILD" "$EXECUTABLE" 44*c8dee2aaSAndroid Build Coastguard Worker 45*c8dee2aaSAndroid Build Coastguard WorkerGCOV="$(realpath tools/gcov_shim)" 46*c8dee2aaSAndroid Build Coastguard Worker 47*c8dee2aaSAndroid Build Coastguard Worker# Generate a zero-baseline so files not covered by $EXECUTABLE $@ will 48*c8dee2aaSAndroid Build Coastguard Worker# still show up in the report. This reads the .gcno files that are 49*c8dee2aaSAndroid Build Coastguard Worker# created at compile time. 50*c8dee2aaSAndroid Build Coastguard Workerlcov -q --gcov-tool="$GCOV" -c -b "$BUILD" -d "$BUILD" -o "$DIR"/baseline -i 51*c8dee2aaSAndroid Build Coastguard Worker 52*c8dee2aaSAndroid Build Coastguard Worker# Running the binary generates the real coverage information, the .gcda files. 53*c8dee2aaSAndroid Build Coastguard WorkerQUEUES=("$1/api_parse_path/fuzzer0/queue/*" "$1/color_deserialize/fuzzer0/queue/*" "$1/skcodec_scale/fuzzer0/queue/*" "$1/skcodec_mode/fuzzer0/queue/*" "$1/api_draw_functions/fuzzer0/queue/*" "$1/api_gradient/fuzzer0/queue/*" "$1/api_image_filter/fuzzer0/queue/*" "$1/api_pathop/fuzzer0/queue/*" "$1/sksl2glsl/fuzzer0/queue/*" "$1/null_canvas/fuzzer0/queue/*" "$1/pdf_canvas/fuzzer0/queue/*" "$1/n32_canvas/fuzzer0/queue/*") 54*c8dee2aaSAndroid Build Coastguard Worker 55*c8dee2aaSAndroid Build Coastguard WorkerARGS=("-n ParsePath" "-t color_deserialize" "-t image_scale" "-t image_mode" "-n DrawFunctions" "-n Gradients" "-n SerializedImageFilter" "-n Pathop" "-t sksl2glsl" "-n NullCanvas" "-n PDFCanvas" "-n RasterN32Canvas") 56*c8dee2aaSAndroid Build Coastguard Worker 57*c8dee2aaSAndroid Build Coastguard Worker# We can't simply pass the directories to the fuzzers because some of the fuzzes will 58*c8dee2aaSAndroid Build Coastguard Worker# crash or assert, which would kill the call to fuzz prematurely. Instead we run them 59*c8dee2aaSAndroid Build Coastguard Worker# individually using the loops below. 60*c8dee2aaSAndroid Build Coastguard Workerfor i in `seq ${#QUEUES[@]}` 61*c8dee2aaSAndroid Build Coastguard Workerdo 62*c8dee2aaSAndroid Build Coastguard Worker FILES=${QUEUES[i]} 63*c8dee2aaSAndroid Build Coastguard Worker for f in $FILES 64*c8dee2aaSAndroid Build Coastguard Worker do 65*c8dee2aaSAndroid Build Coastguard Worker # Executing the fuzzes sequentially would take a very long time. So, we run them 66*c8dee2aaSAndroid Build Coastguard Worker # in the background, making sure we don't go crazy and execute them too fast or 67*c8dee2aaSAndroid Build Coastguard Worker # that they execute for a long time. 68*c8dee2aaSAndroid Build Coastguard Worker timeout 10 $BUILD/$EXECUTABLE ${ARGS[i]} -b $f & 69*c8dee2aaSAndroid Build Coastguard Worker sleep .005s 70*c8dee2aaSAndroid Build Coastguard Worker done 71*c8dee2aaSAndroid Build Coastguard Workerdone 72*c8dee2aaSAndroid Build Coastguard Worker 73*c8dee2aaSAndroid Build Coastguard Workersleep 10s 74*c8dee2aaSAndroid Build Coastguard Worker 75*c8dee2aaSAndroid Build Coastguard Workerecho "done running the fuzzes -- generating report" 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Workerlcov -q --gcov-tool="$GCOV" -c -b "$BUILD" -d "$BUILD" -o "$DIR"/coverage 78*c8dee2aaSAndroid Build Coastguard Worker 79*c8dee2aaSAndroid Build Coastguard Workerlcov -q -a "$DIR"/baseline -a "$DIR"/coverage -o "$DIR"/merged 80*c8dee2aaSAndroid Build Coastguard Worker 81*c8dee2aaSAndroid Build Coastguard Workergenhtml -q "$DIR"/merged --legend -o "$DIR"/coverage_report --ignore-errors source 82*c8dee2aaSAndroid Build Coastguard Worker 83*c8dee2aaSAndroid Build Coastguard Workerxdg-open "$DIR"/coverage_report/index.html 84