github.com/decred/dcrlnd@v0.7.6/scripts/fuzz.sh (about) 1 #!/bin/bash 2 3 set -e 4 5 function build_fuzz() { 6 PACKAGES=$1 7 8 for pkg in $PACKAGES; do 9 pushd fuzz/$pkg 10 11 for file in *.go; do 12 if [[ "$file" == "fuzz_utils.go" ]]; then 13 continue 14 fi 15 16 NAME=$(echo $file | sed 's/\.go$//1') 17 echo "Building zip file for $pkg/$NAME" 18 go-fuzz-build -func "Fuzz_$NAME" -o "$pkg-$NAME-fuzz.zip" "github.com/decred/dcrlnd/fuzz/$pkg" 19 done 20 21 popd 22 done 23 } 24 25 # timeout is a cross platform alternative to the GNU timeout command that 26 # unfortunately isn't available on macOS by default. 27 timeout() { 28 time=$1 29 $2 & 30 pid=$! 31 sleep $time 32 kill -s SIGINT $pid 33 } 34 35 function run_fuzz() { 36 PACKAGES=$1 37 RUN_TIME=$2 38 TIMEOUT=$3 39 PROCS=$4 40 BASE_WORKDIR=$5 41 42 for pkg in $PACKAGES; do 43 pushd fuzz/$pkg 44 45 for file in *.go; do 46 if [[ "$file" == "fuzz_utils.go" ]]; then 47 continue 48 fi 49 50 NAME=$(echo $file | sed 's/\.go$//1') 51 WORKDIR=$BASE_WORKDIR/$pkg/$NAME 52 mkdir -p $WORKDIR 53 echo "Running fuzzer $pkg-$NAME-fuzz.zip with $PROCS processors for $RUN_TIME seconds" 54 COMMAND="go-fuzz -bin=$pkg-$NAME-fuzz.zip -workdir=$WORKDIR -procs=$PROCS -timeout=$TIMEOUT" 55 echo "$COMMAND" 56 timeout "$RUN_TIME" "$COMMAND" 57 done 58 59 popd 60 done 61 } 62 63 # usage prints the usage of the whole script. 64 function usage() { 65 echo "Usage: " 66 echo "fuzz.sh build <packages>" 67 echo "fuzz.sh run <packages> <run_time> <timeout>" 68 } 69 70 # Extract the sub command and remove it from the list of parameters by shifting 71 # them to the left. 72 SUBCOMMAND=$1 73 shift 74 75 # Call the function corresponding to the specified sub command or print the 76 # usage if the sub command was not found. 77 case $SUBCOMMAND in 78 build) 79 echo "Building fuzz packages" 80 build_fuzz "$@" 81 ;; 82 run) 83 echo "Running fuzzer" 84 run_fuzz "$@" 85 ;; 86 *) 87 usage 88 exit 1 89 ;; 90 esac