blob: 64b36f75089072a8753d072abb54f8dd13a3944c [file] [log] [blame]
#!/bin/bash
#
# Minimizer script for manual test case minimization.
#
# Usage:
#
# This script can be used to minimize a dumped reproducer. For instance, if you
# ran the fuzz test from the codelab like this:
#
# FUZZTEST_REPRODUCERS_OUT_DIR=/tmp/reproducers \
# bazel run --config=fuzztest :escaping_test \
# -- --gunit_fuzz=UnescapingAStringNeverTriggersUndefinedBehavior
#
# Then when a crash is found, the crashing input is saved to a file and you
# will see something like this on the terminal:
#
# [*] Reproducer file written to: /tmp/reproducers/r3pr0dUc3r
#
# In order to minimize this reproducer input file, run:
#
# FUZZTEST_MINIMIZE_REPRODUCER=/tmp/reproducers/r3pr0dUc3r \
# bazel run --config=fuzztest :escaping_test \
# --run_under=@com_google_fuzztest//tools:minimizer \
# -- --gunit_fuzz=UnescapingAStringNeverTriggersUndefinedBehavior
#
# This will try to find smaller and smaller inputs until you manually stop the
# process with Ctrl-C. When you do, you'll get a message like:
#
# Find the smallest reproducer at:
#
# /tmp/reproducers/r3pr0dUc3r-min-0008
set -u
readonly ORIGINAL_REPRODUCER="${FUZZTEST_MINIMIZE_REPRODUCER}"
for i in {0001..9999}; do
echo
echo "╔════════════════════════════════════════════════╗"
echo "║ Minimization round: ${i} ║"
echo "╚════════════════════════════════════════════════╝"
echo
TEMP_DIR=$(mktemp -d)
FUZZTEST_REPRODUCERS_OUT_DIR="${TEMP_DIR}" \
FUZZTEST_MINIMIZE_REPRODUCER="${FUZZTEST_MINIMIZE_REPRODUCER}" \
"$@" \
--nosymbolize_stacktrace
if [ $? -eq 130 ]; then
echo
echo "╔═══════════════════════════════════════════════╗"
echo "║ Minimization terminated. ║"
echo "╚═══════════════════════════════════════════════╝"
echo
echo "Find the smallest reproducer at:"
echo
echo "${FUZZTEST_MINIMIZE_REPRODUCER}"
rm -rf "${TEMP_DIR}"
break
fi
SMALLER_REPRODUCER=$(find "${TEMP_DIR}" -type f)
NEW_NAME="${ORIGINAL_REPRODUCER}-min-${i}"
mv "${SMALLER_REPRODUCER}" "${NEW_NAME}"
FUZZTEST_MINIMIZE_REPRODUCER="${NEW_NAME}"
rm -rf "${TEMP_DIR}"
done