From d7e2000790adf5878e1656a066b2a60da8f76643 Mon Sep 17 00:00:00 2001 From: liujia178 Date: Thu, 28 Sep 2023 13:51:21 +0800 Subject: [PATCH] LLVM fuzz test Issue: https://gitee.com/liwentao_uiw/llvmopen-source-transfer-gitee/issues/I852EE Test: fuzz test Signed-off-by: liujia178 --- llvm_test_script/fuzz/build_fuzz_test.sh | 14 ++ llvm_test_script/fuzz/run_fuzzer_test.sh | 202 +++++++++++++++++++++++ llvm_test_script/run_docker.sh | 38 +++++ 3 files changed, 254 insertions(+) create mode 100644 llvm_test_script/fuzz/build_fuzz_test.sh create mode 100644 llvm_test_script/fuzz/run_fuzzer_test.sh diff --git a/llvm_test_script/fuzz/build_fuzz_test.sh b/llvm_test_script/fuzz/build_fuzz_test.sh new file mode 100644 index 0000000..05e7523 --- /dev/null +++ b/llvm_test_script/fuzz/build_fuzz_test.sh @@ -0,0 +1,14 @@ +WORK_DIR=$(pwd) +cd ${WORK_DIR}/llvm-project +cmake -G Ninja -B build \ + -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libunwind;compiler-rt" \ + -DLLVM_ENABLE_PROJECTS="clang;llvm" \ + -DLIBFUZZER_ENABLE=YES \ + -DLIBFUZZER_ENABLE_TESTS=ON \ + -DCOMPILER_RT_INCLUDE_TESTS=ON \ + -DCMAKE_BUILD_TYPE=Release \ + ./llvm +ninja -C build +cd ${WORK_DIR}/llvm-project/build +ninja -v check-fuzzer + diff --git a/llvm_test_script/fuzz/run_fuzzer_test.sh b/llvm_test_script/fuzz/run_fuzzer_test.sh new file mode 100644 index 0000000..96ec87e --- /dev/null +++ b/llvm_test_script/fuzz/run_fuzzer_test.sh @@ -0,0 +1,202 @@ +WORK_DIR=${PWD} +mkdir -p ${WORK_DIR}/Openharmony + +git config --global user.name "maxsu" +git config --global user.email "yiibai.com@gmail.com" + +cp -r ${WORK_DIR}/llvm/toolchain/llvm-project ${WORK_DIR}/ + +# update cmake +cmake_dir=${WORK_DIR}/cmake +mkdir -p ${cmake_dir} +cd ${cmake_dir} +wget -t3 -T10 https://mirrors.huaweicloud.com/harmonyos/compiler/cmake/3.16.5/linux/cmake-linux-x86-3.16.5.tar.gz +tar -xvf cmake-linux-x86-3.16.5.tar.gz + +export PATH=${WORK_DIR}/cmake/linux-x86/bin:$PATH +source ~/.bashrc + +TIME=$(date +%Y%m%d%H%M%S) +time_dir=$(date +%Y-%m-%d) +logdir="${WORK_DIR}/llvmts-log/fuzzer/${time_dir}" +mkdir -p ${logdir} + +# start to test +startTime=`date +%Y%m%d-%H:%M:%S` +startTime_s=`date +%s` +echo "test exec start" + +# run fuzzer test +cd ${WORK_DIR} +bash -x build_fuzz_test.sh +wait +bash -x build_fuzz_test.sh 2>&1 | tee ${logdir}/fuzzer_${TIME}.txt & +wait + +echo "test exec done" +endTime=`date +%Y%m%d-%H:%M:%S` +endTime_s=`date +%s` +sumTime=$[ $endTime_s - $startTime_s ] + +echo "$startTime ---> $endTime" "Total:$sumTime seconds" + +# fuzzer test result +fuzzer_result=1 +if [ -e ${logdir}/fuzzer_${TIME}.txt ]; then + fuzzer_result=0 + # down daily report + git clone https://gitee.com/ya-ning-liu/daily_test.git ${WORK_DIR}/daily_test + + echo "generate fuzz report" + # static-libc++ tests for arch x86_64 + cat ${logdir}/fuzzer_${TIME}.txt|sed -n '/static-libc++ tests for arch x86_64/,/default tests for arch i386/p'|sed '$d' 2>&1 | tee ${logdir}/fuzzer_temp1.txt + grep "Testing Time:" -A 5 ${logdir}/fuzzer_temp1.txt 2>&1 | tee ${logdir}/fuzzer_static_libcxx_x86_report.txt + static_libc_x86_failed="$(grep -E "Failed+\s+:" ${logdir}/fuzzer_static_libcxx_x86_report.txt | tr -d [A-Z][a-z]' ':)" + if [[ $static_libc_x86_failed -gt 0 ]]; then + # fail report + cat ${logdir}/fuzzer_temp1.txt|sed -n '/Failed Tests (/,/FAILED: compiler-rt/p'|sed '$d' 2>&1 | tee ${logdir}/fuzzer_static_libcxx_x86_report.txt + fuzzer_result=1 + # compare report + grep "libFuzzer ::" ${logdir}/fuzzer_static_libcxx_x86_report.txt 2>&1 | tee ${logdir}/fuzzer_static_libcxx_x86_new.txt + grep "libFuzzer ::" ${WORK_DIR}/daily_test/report/fuzz/fuzzer_static_libcxx_x86_report.txt 2>&1 | tee ${logdir}/fuzzer_static_libcxx_x86_old.txt + grep -vFf ${logdir}/fuzzer_static_libcxx_x86_old.txt ${logdir}/fuzzer_static_libcxx_x86_new.txt 2>&1 | tee ${logdir}/fuzzer_static_libcxx_x86_diff.txt + if [ -s ${logdir}/fuzzer_static_libcxx_x86_diff.txt ]; then + sed -i '1iNew failed use cases:' ${logdir}/fuzzer_static_libcxx_x86_diff.txt + else + echo No failure cases added >> ${logdir}/fuzzer_static_libcxx_x86_diff.txt + fi + rm -rf ${logdir}/fuzzer_static_libcxx_x86_new.txt ${logdir}/fuzzer_static_libcxx_x86_old.txt + fi + + # default tests for arch i386 + cat ${logdir}/fuzzer_${TIME}.txt|sed -n '/default tests for arch i386/,/unit tests/p'|sed '$d' 2>&1 | tee ${logdir}/fuzzer_temp2.txt + grep "Testing Time:" -A 5 ${logdir}/fuzzer_temp2.txt 2>&1 | tee ${logdir}/fuzzer_default_test_i386_report.txt + defaul_test_i386_failed="$(grep -E "Failed+\s+:" ${logdir}/fuzzer_default_test_i386_report.txt | tr -d [A-Z][a-z]' ':)" + if [[ $defaul_test_i386_failed -gt 0 ]]; then + # fail report + cat ${logdir}/fuzzer_temp2.txt|sed -n '/Failed Tests (/,/FAILED: compiler-rt/p'|sed '$d' 2>&1 | tee ${logdir}/fuzzer_default_test_i386_report.txt + fuzzer_result=1 + # compare report + grep "libFuzzer ::" ${logdir}/fuzzer_default_test_i386_report.txt 2>&1 | tee ${logdir}/fuzzer_default_test_i386_new.txt + grep "libFuzzer ::" ${WORK_DIR}/daily_test/report/fuzz/fuzzer_default_test_i386_report.txt 2>&1 | tee ${logdir}/fuzzer_default_test_i386_old.txt + grep -vFf ${logdir}/fuzzer_default_test_i386_old.txt ${logdir}/fuzzer_default_test_i386_new.txt 2>&1 | tee ${logdir}/fuzzer_default_test_i386_diff.txt + if [ -s ${logdir}/fuzzer_default_test_i386_diff.txt ]; then + sed -i '1iNew failed use cases:' ${logdir}/fuzzer_default_test_i386_diff.txt + else + echo No failure cases added >> ${logdir}/fuzzer_default_test_i386_diff.txt + fi + rm -rf ${logdir}/fuzzer_default_test_i386_new.txt ${logdir}/fuzzer_default_test_i386_old.txt + fi + + # unit tests + cat ${logdir}/fuzzer_${TIME}.txt|sed -n '/unit tests/,/default tests for arch x86_64/p'|sed '$d' 2>&1 | tee ${logdir}/fuzzer_temp3.txt + grep "Testing Time:" -A 5 ${logdir}/fuzzer_temp3.txt 2>&1 | tee ${logdir}/fuzzer_unit_test_report.txt + unit_test_failed="$(grep -E "Failed+\s+:" ${logdir}/fuzzer_unit_test_report.txt | tr -d [A-Z][a-z]' ':)" + if [[ $unit_test_failed -gt 0 ]]; then + # fail report + cat ${logdir}/fuzzer_temp3.txt|sed -n '/Failed Tests (/,/FAILED: compiler-rt/p'|sed '$d' 2>&1 | tee ${logdir}/fuzzer_unit_test_report.txt + fuzzer_result=1 + # compare report + grep "libFuzzer ::" ${logdir}/fuzzer_unit_test_report.txt 2>&1 | tee ${logdir}/fuzzer_unit_test_new.txt + grep "libFuzzer ::" ${WORK_DIR}/daily_test/report/fuzz/fuzzer_unit_test_report.txt 2>&1 | tee ${logdir}/fuzzer_unit_test_old.txt + grep -vFf ${logdir}/fuzzer_unit_test_old.txt ${logdir}/fuzzer_unit_test_new.txt 2>&1 | tee ${logdir}/fuzzer_unit_test_diff.txt + if [ -s ${logdir}/fuzzer_unit_test_diff.txt ]; then + sed -i '1iNew failed use cases:' ${logdir}/fuzzer_unit_test_diff.txt + else + echo No failure cases added >> ${logdir}/fuzzer_unit_test_diff.txt + fi + rm -rf ${logdir}/fuzzer_unit_test_new.txt ${logdir}/fuzzer_unit_test_old.txt + fi + + # default tests for arch x86_64 + cat ${logdir}/fuzzer_${TIME}.txt|sed -n '/default tests for arch x86_64/,/libc++ tests for arch x86_64/p'|sed '$d' 2>&1 | tee ${logdir}/fuzzer_temp4.txt + grep "Testing Time:" -A 5 ${logdir}/fuzzer_temp4.txt 2>&1 | tee ${logdir}/fuzzer_default_test_x86_report.txt + default_test_x86_failed="$(grep -E "Failed+\s+:" ${logdir}/fuzzer_default_test_x86_report.txt | tr -d [A-Z][a-z]' ':)" + if [[ $default_test_x86_failed -gt 0 ]]; then + # fail report + cat ${logdir}/fuzzer_temp4.txt|sed -n '/Failed Tests (/,/FAILED: compiler-rt/p'|sed '$d' 2>&1 | tee ${logdir}/fuzzer_default_test_x86_report.txt + fuzzer_result=1 + # compare report + grep "libFuzzer ::" ${logdir}/fuzzer_default_test_x86_report.txt 2>&1 | tee ${logdir}/fuzzer_default_test_x86_new.txt + grep "libFuzzer ::" ${WORK_DIR}/daily_test/report/fuzz/fuzzer_default_test_x86_report.txt 2>&1 | tee ${logdir}/fuzzer_default_test_x86_old.txt + grep -vFf ${logdir}/fuzzer_default_test_x86_old.txt ${logdir}/fuzzer_default_test_x86_new.txt 2>&1 | tee ${logdir}/fuzzer_default_test_x86_diff.txt + if [ -s ${logdir}/fuzzer_default_test_x86_diff.txt ]; then + sed -i '1iNew failed use cases:' ${logdir}/fuzzer_default_test_x86_diff.txt + else + echo No failure cases added >> ${logdir}/fuzzer_default_test_x86_diff.txt + fi + rm -rf ${logdir}/fuzzer_default_test_x86_new.txt ${logdir}/fuzzer_default_test_x86_old.txt + fi + + # libc++ tests for arch x86_64 + cat ${logdir}/fuzzer_${TIME}.txt|sed -n '/libFuzzer libc++ tests for arch x86_64/,/static-libc++ tests/p'|sed '$d' 2>&1 | tee ${logdir}/fuzzer_temp5.txt + grep "Testing Time:" -A 5 ${logdir}/fuzzer_temp5.txt 2>&1 | tee ${logdir}/fuzzer_libcxx_x86_report.txt + libcxx_x86_failed="$(grep -E "Failed+\s+:" ${logdir}/fuzzer_libcxx_x86_report.txt | tr -d [A-Z][a-z]' ':)" + if [[ $libcxx_x86_failed -gt 0 ]]; then + # fail report + cat ${logdir}/fuzzer_temp5.txt|sed -n '/Failed Tests (/,/FAILED: compiler-rt/p'|sed '$d' 2>&1 | tee ${logdir}/fuzzer_libcxx_x86_report.txt + fuzzer_result=1 + # compare report + grep "libFuzzer ::" ${logdir}/fuzzer_libcxx_x86_report.txt 2>&1 | tee ${logdir}/fuzzer_libcxx_x86_new.txt + grep "libFuzzer ::" ${WORK_DIR}/daily_test/report/fuzz/fuzzer_libcxx_x86_report.txt 2>&1 | tee ${logdir}/fuzzer_libcxx_x86_old.txt + grep -vFf ${logdir}/fuzzer_libcxx_x86_old.txt ${logdir}/fuzzer_libcxx_x86_new.txt 2>&1 | tee ${logdir}/fuzzer_libcxx_x86_diff.txt + if [ -s ${logdir}/fuzzer_libcxx_x86_diff.txt ]; then + sed -i '1iNew failed use cases:' ${logdir}/fuzzer_libcxx_x86_diff.txt + else + echo No failure cases added >> ${logdir}/fuzzer_libcxx_x86_diff.txt + fi + rm -rf ${logdir}/fuzzer_libcxx_x86_new.txt ${logdir}/fuzzer_libcxx_x86_old.txt + fi + + # static-libc++ tests for arch i386 + cat ${logdir}/fuzzer_${TIME}.txt|sed -n '/static-libc++ tests for arch i386/,/libc++ tests/p'|sed '$d' 2>&1 | tee ${logdir}/fuzzer_temp6.txt + grep "Testing Time:" -A 5 ${logdir}/fuzzer_temp6.txt 2>&1 | tee ${logdir}/fuzzer_static_libcxx_i386_report.txt + static_libcxx_i386_failed="$(grep -E "Failed+\s+:" ${logdir}/fuzzer_static_libcxx_i386_report.txt | tr -d [A-Z][a-z]' ':)" + if [[ $static_libcxx_i386_failed -gt 0 ]]; then + # fail report + cat ${logdir}/fuzzer_temp6.txt|sed -n '/Failed Tests (/,/FAILED: compiler-rt/p'|sed '$d' 2>&1 | tee ${logdir}/fuzzer_static_libcxx_i386_report.txt + fuzzer_result=1 + + # compare report + grep "libFuzzer ::" ${logdir}/fuzzer_static_libcxx_i386_report.txt 2>&1 | tee ${logdir}/fuzzer_static_libcxx_i386_new.txt + grep "libFuzzer ::" ${WORK_DIR}/daily_test/report/fuzz/fuzzer_static_libcxx_i386_report.txt 2>&1 | tee ${logdir}/fuzzer_static_libcxx_i386_old.txt + grep -vFf ${logdir}/fuzzer_static_libcxx_i386_old.txt ${logdir}/fuzzer_static_libcxx_i386_new.txt 2>&1 | tee ${logdir}/fuzzer_static_libcxx_i386_diff.txt + if [ -s ${logdir}/fuzzer_static_libcxx_i386_diff.txt ]; then + sed -i '1iNew failed use cases:' ${logdir}/fuzzer_static_libcxx_i386_diff.txt + else + echo No failure cases added >> ${logdir}/fuzzer_static_libcxx_i386_diff.txt + fi + rm -rf ${logdir}/fuzzer_static_libcxx_i386_new.txt ${logdir}/fuzzer_static_libcxx_i386_old.txt + fi + + # libc++ tests for arch i386 + grep "libFuzzer libc++ tests for arch i386" ${logdir}/fuzzer_${TIME}.txt -A 300 2>&1 | tee ${logdir}/fuzzer_temp7.txt + grep "Testing Time:" -A 5 ${logdir}/fuzzer_temp7.txt 2>&1 | tee ${logdir}/fuzzer_libcxx_i386_report.txt + libcxx_i386_failed="$(grep -E "Failed+\s+:" ${logdir}/fuzzer_libcxx_i386_report.txt | tr -d [A-Z][a-z]' ':)" + if [[ $libcxx_i386_failed -gt 0 ]]; then + # fail report + cat ${logdir}/fuzzer_temp7.txt|sed -n '/Failed Tests (/,/FAILED: compiler-rt/p'|sed '$d' 2>&1 | tee ${logdir}/fuzzer_libcxx_i386_report.txt + fuzzer_result=1 + + # compare report + grep "libFuzzer ::" ${logdir}/fuzzer_libcxx_i386_report.txt 2>&1 | tee ${logdir}/fuzzer_libcxx_i386_new.txt + grep "libFuzzer ::" ${WORK_DIR}/daily_test/report/fuzz/fuzzer_static_libcxx_i386_report.txt 2>&1 | tee ${logdir}/fuzzer_libcxx_i386_old.txt + grep -vFf ${logdir}/fuzzer_libcxx_i386_old.txt ${logdir}/fuzzer_libcxx_i386_new.txt 2>&1 | tee ${logdir}/fuzzer_libcxx_i386_diff.txt + if [ -s ${logdir}/fuzzer_libcxx_i386_diff.txt ]; then + sed -i '1iNew failed use cases:' ${logdir}/fuzzer_libcxx_i386_diff.txt + else + echo No failure cases added >> ${logdir}/fuzzer_libcxx_i386_diff.txt + fi + rm -rf ${logdir}/fuzzer_libcxx_i386_new.txt ${logdir}/fuzzer_libcxx_i386_old.txt + fi + rm -rf ${logdir}/fuzzer_temp*.txt +fi + +if [[ $fuzzer_result -eq 1 ]]; then + echo "fuzz has failed tests" + exit 1 +fi + + + + diff --git a/llvm_test_script/run_docker.sh b/llvm_test_script/run_docker.sh index f7fc9ba..a73c1c4 100755 --- a/llvm_test_script/run_docker.sh +++ b/llvm_test_script/run_docker.sh @@ -1,6 +1,31 @@ git config --global user.name "maxsu" git config --global user.email "yiibai.com@gmail.com" +check_mode=0 +while getopts "t:sh" opt +do + case $opt in + t) + check_type=$* + ;; + s) + check_mode=1 + ;; + h) + echo "Usage: ./run_docker.sh [-t={asan,fuzz,ndk,checksec,pugin}] [OPTION]" + echo + echo "Options are:" + echo " -t target: asan/fuzz/ndk/checksec/pugin" + echo " -h" + exit 0 + ;; + ?) + echo "unknown options" + exit 1 + ;; + esac +done + # 门禁上路径是/home/pool_002/harmony_master WORK_DIR=${PWD} startruntime=`date +%s` @@ -86,6 +111,19 @@ mv ${WORK_DIR}/llvm_tool/clang-dev ${WORK_DIR}/llvm_tool/clang endruntime=`date +%s` timebeforetest=$[ $endruntime - $startruntime ] echo "the time before test is : ----->" "$timebeforetest" + +# start run fuzz test +if echo ${check_type} | grep fuzz; then + echo "run fuzz test" + cd ${WORK_DIR}/llvmopen-source-transfer-gitee/llvm_test_script/fuzz/ + cp run_fuzzer_test.sh build_fuzz_test.sh ${WORK_DIR}/ + cd ${WORK_DIR} + bash run_fuzzer_test.sh + if [ $check_mode -eq 1 ]; then + exit + fi +fi + # start to test cd ${WORK_DIR}/llvmopen-source-transfer-gitee/llvm_test_script -- Gitee