| #!/bin/bash |
| PROJECT_PATH=system/core/fs_mgr/libsnapshot |
| FUZZ_TARGET=libsnapshot_fuzzer |
| TARGET_ARCH=$(get_build_var TARGET_ARCH) |
| FUZZ_BINARY=/data/fuzz/${TARGET_ARCH}/${FUZZ_TARGET}/${FUZZ_TARGET} |
| DEVICE_INIT_CORPUS_DIR=/data/fuzz/${TARGET_ARCH}/${FUZZ_TARGET}/corpus |
| DEVICE_GENERATED_CORPUS_DIR=/data/local/tmp/${FUZZ_TARGET}/corpus |
| DEVICE_GCOV_DIR=/data/local/tmp/${FUZZ_TARGET}/gcov |
| HOST_SCRATCH_DIR=/tmp/${FUZZ_TARGET} |
| GCOV_TOOL=${HOST_SCRATCH_DIR}/llvm-gcov |
| |
| build_normal() ( |
| pushd $(gettop) |
| NATIVE_COVERAGE="" NATIVE_LINE_COVERAGE="" NATIVE_COVERAGE_PATHS="" m ${FUZZ_TARGET} |
| ret=$? |
| popd |
| return ${ret} |
| ) |
| |
| build_cov() { |
| pushd $(gettop) |
| NATIVE_COVERAGE="true" NATIVE_LINE_COVERAGE="true" NATIVE_COVERAGE_PATHS="${PROJECT_PATH}" m ${FUZZ_TARGET} |
| ret=$? |
| popd |
| return ${ret} |
| } |
| |
| prepare_device() { |
| adb root && adb remount && |
| adb shell mkdir -p ${DEVICE_GENERATED_CORPUS_DIR} && |
| adb shell rm -rf ${DEVICE_GCOV_DIR} && |
| adb shell mkdir -p ${DEVICE_GCOV_DIR} |
| } |
| |
| push_binary() { |
| adb push ${ANDROID_PRODUCT_OUT}/${FUZZ_BINARY} ${FUZZ_BINARY} && |
| adb push ${ANDROID_PRODUCT_OUT}/${DEVICE_INIT_CORPUS_DIR} $(dirname ${FUZZ_BINARY}) |
| } |
| |
| prepare_host() { |
| which lcov || { |
| echo "please run:"; |
| echo " sudo apt-get install lcov "; |
| return 1; |
| } |
| rm -rf ${HOST_SCRATCH_DIR} && |
| mkdir -p ${HOST_SCRATCH_DIR} |
| } |
| |
| # run_snapshot_fuzz -runs=10000 |
| generate_corpus() { |
| [[ "$@" ]] || { echo "run with -runs=X"; return 1; } |
| |
| prepare_device && |
| build_normal && |
| push_binary && |
| adb shell ${FUZZ_BINARY} "$@" ${DEVICE_INIT_CORPUS_DIR} ${DEVICE_GENERATED_CORPUS_DIR} |
| } |
| |
| run_snapshot_fuzz() { |
| prepare_device && |
| build_cov && |
| push_binary && |
| adb shell GCOV_PREFIX=${DEVICE_GCOV_DIR} GCOV_PREFIX_STRIP=3 \ |
| ${FUZZ_BINARY} \ |
| -runs=0 \ |
| ${DEVICE_INIT_CORPUS_DIR} ${DEVICE_GENERATED_CORPUS_DIR} |
| } |
| |
| show_fuzz_result() { |
| prepare_host && |
| unzip -o -j -d ${HOST_SCRATCH_DIR} ${ANDROID_PRODUCT_OUT}/coverage/data/fuzz/${TARGET_ARCH}/${FUZZ_TARGET}/${FUZZ_TARGET}.zip && |
| adb shell find ${DEVICE_GCOV_DIR} -type f | xargs -I {} adb pull {} ${HOST_SCRATCH_DIR} && |
| ls ${HOST_SCRATCH_DIR} && |
| cat > ${GCOV_TOOL} <<< ' |
| #!/bin/bash |
| exec llvm-cov gcov "$@" |
| ' && |
| chmod +x ${GCOV_TOOL} && |
| lcov --directory ${HOST_SCRATCH_DIR} --base-directory $(gettop) --gcov-tool ${GCOV_TOOL} --capture -o ${HOST_SCRATCH_DIR}/report.cov && |
| genhtml ${HOST_SCRATCH_DIR}/report.cov -o ${HOST_SCRATCH_DIR}/html && |
| echo file://$(realpath ${HOST_SCRATCH_DIR}/html/index.html) |
| } |
| |
| # run_snapshot_fuzz -runs=10000 |
| run_snapshot_fuzz_all() { |
| generate_corpus "$@" && |
| run_snapshot_fuzz && |
| show_fuzz_result |
| } |