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