| #!/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 \ | |
| # -- --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 \ | |
| # -- --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 |