From 82d98b29a39338e12728798596a16239f81f1025 Mon Sep 17 00:00:00 2001 From: Eugene Siegel Date: Tue, 8 Oct 2024 06:32:31 -0400 Subject: [PATCH] Add a script to produce combined fuzzing coverage profiles. --- cov_profiles.sh | 68 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100755 cov_profiles.sh diff --git a/cov_profiles.sh b/cov_profiles.sh new file mode 100755 index 00000000..7c690972 --- /dev/null +++ b/cov_profiles.sh @@ -0,0 +1,68 @@ +#!/bin/bash +# +# Fetches coverage data for each fuzz test, combines them, and produces a +# coverage profile that can be analyzed. +if [[ "$#" -ne 1 ]]; then + echo "Usage: $0 LND_DIR" + exit 1 +fi + +readonly LND_DIR=$1 +readonly CACHE_DIR=$(mktemp -d) + +# Get the directory of cov_profiles.sh in case it is being called not in +# lnd-fuzz. +BASE_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +packages=("lnwire" "brontide" "htlcswitch/hop" "tlv" "watchtower/wtwire" "watchtower/wtclient" "zpay32") + +# collect_combine_cov_profiles collects coverage for each fuzzing package and +# then combines them. +function collect_combine_cov_profiles { + coverage_dirs=() + + # Collect coverage profiles. + for p in ${packages[@]}; do + cd $PWD/$p/testdata/fuzz + + for f in $(ls $PWD); do + # Move corpus to CACHE_DIR. + mkdir -p $CACHE_DIR/$f + cp -a "${BASE_DIR}/$p/testdata/fuzz/${f}"/ "${CACHE_DIR}/$f/" + num_inputs=$(ls "${CACHE_DIR}/$f/" | wc -l | xargs) + mkdir -p $BASE_DIR/coverage/$f + + cd $LND_DIR/$p/ + + go test -v -cover -run="^${f}$" -fuzz="^${f}$" \ + -fuzztime="${num_inputs}x" -args \ + -test.gocoverdir="$BASE_DIR/coverage/$f" \ + -test.fuzzcachedir="${CACHE_DIR}" + + coverage_dirs+=("coverage/$f") + done + + cd $BASE_DIR + done + + # Combine coverage profiles. + profile_str="" + coverage_dirs_len=${#coverage_dirs[@]} + + for (( i = 1; i <= $coverage_dirs_len; i++ )) + do + let "index = $i - 1" + if [[ $i -eq $coverage_dirs_len ]] + then + profile_str+="./${coverage_dirs[$index]}" + break + fi + + profile_str+="./${coverage_dirs[$index]}," + done + + go tool covdata textfmt -i=$profile_str -o coverage/profile +} + + +collect_combine_cov_profiles \ No newline at end of file