From 29bbcb56adb553049487776581c1cee5b83a749f Mon Sep 17 00:00:00 2001 From: liujia178 Date: Thu, 2 Nov 2023 16:51:53 +0800 Subject: [PATCH] LLVM asan test Issue:https://gitee.com/liwentao_uiw/llvmopen-source-transfer-gitee/issues/I852LW Test:asan test Signed-off-by: liujia178 --- llvm_test_script/asan/run_asan_test.sh | 167 +++++++++++++++++++++++++ llvm_test_script/asan/run_build_oh.sh | 64 ++++++++++ llvm_test_script/asan/run_pull_oh.sh | 27 ++++ llvm_test_script/run_docker.sh | 23 ++++ 4 files changed, 281 insertions(+) create mode 100755 llvm_test_script/asan/run_asan_test.sh create mode 100644 llvm_test_script/asan/run_build_oh.sh create mode 100755 llvm_test_script/asan/run_pull_oh.sh diff --git a/llvm_test_script/asan/run_asan_test.sh b/llvm_test_script/asan/run_asan_test.sh new file mode 100755 index 0000000..ff97483 --- /dev/null +++ b/llvm_test_script/asan/run_asan_test.sh @@ -0,0 +1,167 @@ +#!/bin/bash +WORK_DIR=${PWD} + +# asan test +if [ -d ${WORK_DIR}/wiki ];then + rm -rf -d ${WORK_DIR}/wiki +fi +git clone https://gitee.com/ya-ning-liu/wiki.git + + +tar -jxvf ${WORK_DIR}/llvm/packages/ohos-sysroot-dev.tar.bz2 -C ${WORK_DIR}/wiki/asan/ +tar -jxvf ${WORK_DIR}/llvm/packages/clang-dev-linux-x86_64.tar.bz2 -C ${WORK_DIR}/wiki/asan/ + +cp -r ${WORK_DIR}/llvm/toolchain/llvm-project ${WORK_DIR}/wiki/asan/ + +export PATH=${WORK_DIR}/harmony_code/prebuilts/cmake/linux-x86/bin:$PATH >> ~/.bashrc +export PATH=${WORK_DIR}/loader_file/toolchains/:$PATH >> ~/.bashrc +source ~/.bashrc + + +TIME=$(date +%Y%m%d%H%M%S) +time_dir=$(date +%Y-%m-%d) +logdir="${WORK_DIR}/llvmts-log/asan/${time_dir}" +mkdir -p ${logdir} + +# start to test +startTime=`date +%Y%m%d-%H:%M:%S` +startTime_s=`date +%s` +echo "test exec start" + +hdc shell mount -o rw,remount / +hdc file send ${WORK_DIR}/wiki/asan/ubsan.cfg /etc/init/ +hdc shell reboot +sleep 10 + +# build asan +pushd ${WORK_DIR}/wiki/asan +bash -x build_symbolizer.sh +wait +popd + +pushd ${WORK_DIR}/wiki/asan/llvm-project +patch -p1 < ${WORK_DIR}/wiki/asan/hdc.patch +echo "apply hdc patch" +popd + + +# run asan +pushd ${WORK_DIR}/wiki/asan +bash -x run_build-arm-asan.sh 2>&1 | tee ${logdir}/asan_${TIME}.txt & +wait +popd + +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" + +# asan report +check_asan_dynamic=1 +check_asan=1 +asan_uint=1 +if [ -e ${logdir}/asan_${TIME}.txt ]; then + # check-asan-dynamic log + check_asan_dynamic=0 + cat ${logdir}/asan_${TIME}.txt|tac|sed -n '1,/LIT_FILTER=/p'|tac 2>&1 | tee ${logdir}/check_asan_dynamic_log.txt + # generate summary report + grep "Testing Time:" -A 5 ${logdir}/check_asan_dynamic_log.txt 2>&1 | tee ${logdir}/check_asan_dynamic_report.txt + if !(grep -q "Failed+\s+:" ${logdir}/check_asan_dynamic_report.txt); then + # fail report + cat ${logdir}/check_asan_dynamic_log.txt|sed -n '/Failed Tests (/,/FAILED: test/p'|sed '$d' 2>&1 | tee ${logdir}/check_asan_dynamic_report.txt + asan_dynamic_unsupported="$(grep -E "Unsupported+\s+:" ${logdir}/check_asan_dynamic_report.txt | tr -d [A-Z][a-z]' ':)" + asan_dynamic_expe_fail="$(grep -E "Expectedly Failed:" ${logdir}/check_asan_dynamic_report.txt | tr -d [A-Z][a-z]' ':)" + asan_dynamic_failed="$(grep -E "Failed+\s+:" ${logdir}/check_asan_dynamic_report.txt | tr -d [A-Z][a-z]' ':)" + if [[ $asan_dynamic_failed -gt 0 ]]; then + check_asan_dynamic=1 + fi + fi + + # check-asan log + check_asan=0 + cat ${logdir}/asan_${TIME}.txt|sed -n '/LIT_FILTER=/,/LIT_FILTER/p'|sed '$d' 2>&1 | tee ${logdir}/check_asan_log.txt + # generate summary report + grep "Testing Time:" -A 5 ${logdir}/check_asan_log.txt 2>&1 | tee ${logdir}/check_asan_report.txt + if !(grep -q "Failed+\s+:" ${logdir}/check_asan_report.txt); then + # fail report + cat ${logdir}/check_asan_log.txt|sed -n '/Failed Tests (/,/FAILED: test/p'|sed '$d' 2>&1 | tee ${logdir}/check_asan_report.txt + asan_unsupported="$(grep -E "Unsupported+\s+:" ${logdir}/check_asan_report.txt | tr -d [A-Z][a-z]' ':)" + asan_expe_fail="$(grep -E "Expectedly Failed:" ${logdir}/check_asan_report.txt | tr -d [A-Z][a-z]' ':)" + asan_failed="$(grep -E "Failed+\s+:" ${logdir}/check_asan_report.txt | tr -d [A-Z][a-z]' ':)" + if [[ $asan_failed -gt 0 ]]; then + check_asan=1 + fi + fi + + # unit log + asan_uint=0 + cat ${logdir}/asan_${TIME}.txt|sed -n '1,/ninja -v check-asan/p' 2>&1 | tee ${logdir}/asan_unit_log.txt + # generate summary report + if [ -e ${logdir}/asan_unit_report.txt ]; then + rm -rf ${logdir}/asan_unit_report.txt + fi + run="$(grep -c "\[\sRUN" ${logdir}/asan_unit_log.txt)" + pass="$(grep -c "OK\s\]" ${logdir}/asan_unit_log.txt)" + echo SUMMARY >> ${logdir}/asan_unit_report.txt + echo Run: $run >> ${logdir}/asan_unit_report.txt + echo Pass: $pass >> ${logdir}/asan_unit_report.txt + fail_fakestack="$(grep -c "\[\s\sFAILED\s\s\]\sFakeStack" ${logdir}/asan_unit_log.txt)" + fail_Address="$(grep -c "\[\s\sFAILED\s\s\]\sAddress" ${logdir}/asan_unit_log.txt)" + fail=$[ $fail_fakestack + $fail_Address ] + echo Fail: $fail >> ${logdir}/asan_unit_report.txt + if [[ $fail -gt 0 ]]; then + asan_uint=1 + echo "" >> ${logdir}/asan_unit_report.txt + echo [Failed List]: >> ${logdir}/asan_unit_report.txt + grep "\[\s\sFAILED\s\s\]\sAddress" ${logdir}/asan_unit_log.txt >> ${logdir}/asan_unit_report.txt + fi +fi + +# report compare +# download daily asan report +git clone https://gitee.com/ya-ning-liu/daily_test.git ${WORK_DIR}/daily_test + +if [[ -e ${logdir}/check_asan_report.txt ]]; then + grep "AddressSanitizer-arm-ohos ::" ${logdir}/check_asan_report.txt 2>&1 | tee ${logdir}/check_asan_new.txt + grep "AddressSanitizer-arm-ohos ::" ${WORK_DIR}/daily_test/report/asan/check_asan_report.txt 2>&1 | tee ${logdir}/check_asan_old.txt + grep -vFf ${logdir}/check_asan_old.txt ${logdir}/check_asan_new.txt 2>&1 | tee ${logdir}/check_asan_diff.txt + if [ -s ${logdir}/check_asan_diff.txt ]; then + sed -i '1iNew failed use cases:' ${logdir}/check_asan_diff.txt + else + echo No failure cases added >> ${logdir}/check_asan_diff.txt + fi +fi + +if [[ -e ${logdir}/check_asan_dynamic_report.txt ]]; then + grep "AddressSanitizer-arm-ohos-dynamic ::" ${logdir}/check_asan_dynamic_report.txt 2>&1 | tee ${logdir}/check_asan_dynamic_new.txt + grep "AddressSanitizer-arm-ohos-dynamic ::" ${WORK_DIR}/daily_test/report/asan/check_asan_dynamic_report.txt 2>&1 | tee ${logdir}/check_asan_dynamic_old.txt + grep -vFf ${logdir}/check_asan_dynamic_old.txt ${logdir}/check_asan_dynamic_new.txt 2>&1 | tee ${logdir}/check_asan_dynamic_diff.txt + if [ -s ${logdir}/check_asan_dynamic_diff.txt ]; then + sed -i '1iNew failed use cases:' ${logdir}/check_asan_dynamic_diff.txt + else + echo No failure cases added >> ${logdir}/check_asan_dynamic_diff.txt + fi +fi + +if [[ -e ${logdir}/asan_unit_report.txt ]]; then + grep "FAILED" ${logdir}/asan_unit_report.txt |sed -e 's/([^()]*)//g' 2>&1 | tee ${logdir}/asan_unit_new.txt + grep "FAILED" ${WORK_DIR}/daily_test/report/asan/asan_unit_report.txt |sed -e 's/([^()]*)//g' 2>&1 | tee ${logdir}/asan_unit_old.txt + grep -vFf ${logdir}/asan_unit_old.txt ${logdir}/asan_unit_new.txt 2>&1 | tee ${logdir}/asan_unit_diff.txt + if [ -s ${logdir}/asan_unit_diff.txt ]; then + sed -i '1iNew failed use cases:' ${logdir}/asan_unit_diff.txt + else + echo No failure cases added >> ${logdir}/asan_unit_diff.txt + fi +fi + + +rm -rf ${logdir}/check_asan_new.txt ${logdir}/check_asan_old.txt +rm -rf ${logdir}/check_asan_dynamic_new.txt ${logdir}/check_asan_dynamic_old.txt +rm -rf ${logdir}/asan_unit_new.txt ${logdir}/asan_unit_old.txt + +if [[ ($check_asan_dynamic -eq 1) || ($check_asan -eq 1) || ($asan_uint -eq 1)]]; then + echo "asan has failed tests" + exit 1 +fi \ No newline at end of file diff --git a/llvm_test_script/asan/run_build_oh.sh b/llvm_test_script/asan/run_build_oh.sh new file mode 100644 index 0000000..0bef8c7 --- /dev/null +++ b/llvm_test_script/asan/run_build_oh.sh @@ -0,0 +1,64 @@ +WORK_DIR=${PWD} +startruntime=`date +%s` + +sudo apt-get update && sudo apt-get install binutils git git-lfs gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip m4 bc gnutls-bin python3.8 python3-pip ruby libtinfo-dev libtinfo5 xorg-dev libssl-dev npm +sudo apt-get install libxcursor-dev libxrandr-dev libxinerama-dev + +llvm_dir="${WORK_DIR}/harmony_code/prebuilts/clang/ohos/linux-x86_64" + +# update llvm +if [[ -e "${llvm_dir}/llvm" ]];then + rm -rf "${llvm_dir}/llvm" +fi +tar -jxvf ${WORK_DIR}/llvm/packages/clang-dev-linux-x86_64.tar.bz2 -C ${llvm_dir} +mv ${llvm_dir}/clang-dev ${llvm_dir}/llvm + +# update libcxx-ndk +if [[ -e "${llvm_dir}/libcxx-ndk" ]];then + rm -rf "${llvm_dir}/libcxx-ndk" +fi +tar -jxvf ${WORK_DIR}/llvm/packages/libcxx-ndk-dev-linux-x86_64.tar.bz2 -C ${llvm_dir} + +# update llvm-ndk +if [[ -e "${llvm_dir}/llvm_ndk" ]];then + rm -rf "${llvm_dir}/llvm_ndk" +fi +mkdir -p "${llvm_dir}/llvm_ndk" +cp -af "${llvm_dir}/llvm/include" "${llvm_dir}/llvm_ndk" +cp -rfp "${llvm_dir}/libcxx-ndk/include" "${llvm_dir}/llvm_ndk" + +# build oh images start +buildtime_s=`date +%s` +echo "build oh start" + +pushd ${WORK_DIR}/harmony_code +./build.sh --product-name rk3568 --ccache --build-target make_all --gn-args enable_notice_collection=false --disable-package-image --gn-args enable_lto_O0=true --gn-args skip_generate_module_list_file=true --disable-part-of-post-build output_part_rom_status --disable-part-of-post-build get_warning_list --disable-part-of-post-build compute_overlap_rate --gn-args load_test_config=false +wait +popd + +buildtime_e=`date +%s` +sumbuildtime=$[ $buildtime_e - $buildtime_s ] +echo "the build sumtime ---->: " " $sumbuildtime" + +# oh image flash +mkdir -p ${WORK_DIR}/loader_file +unzip ${WORK_DIR}/harmony_code/out/sdk/packages/ohos-sdk/linux/toolchains*.zip -d ${WORK_DIR}/loader_file + +export PATH=${WORK_DIR}/loader_file/toolchains/:$PATH >> ~/.bashrc +source ~/.bashrc + +mkdir -p ${WORK_DIR}/loader_file/out/ohos-arm-release/packages/phone +cp -r ${WORK_DIR}/harmony_code/out/rk3568/packages/phone/images ${WORK_DIR}/loader_file/out/ohos-arm-release/packages/phone/ + + +# flash image +cd ${WORK_DIR}/loader_file +git clone https://gitee.com/hihope_iot/docs.git +cp -r ${WORK_DIR}/loader_file/docs/HiHope_DAYU200/烧写工具及指南/linux/bin ${WORK_DIR}/loader_file/ +cp -r ${WORK_DIR}/loader_file/docs/HiHope_DAYU200/烧写工具及指南/linux/etc/udev/rules.d/85-rk3568.rules /etc/udev/rules.d/ +cp -r ${WORK_DIR}/loader_file/docs/HiHope_DAYU200/烧写工具及指南/linux/flash.py ${WORK_DIR}/loader_file +sudo udevadm control --reload + +hdc shell reboot loader +python3 flash.py -q +python3 flash.py -a \ No newline at end of file diff --git a/llvm_test_script/asan/run_pull_oh.sh b/llvm_test_script/asan/run_pull_oh.sh new file mode 100755 index 0000000..3b168d9 --- /dev/null +++ b/llvm_test_script/asan/run_pull_oh.sh @@ -0,0 +1,27 @@ +WORK_DIR=${PWD} +pulltime_s=`date +%s` + +# download openharmony code +mkdir -p ${WORK_DIR}/harmony_code +rm -r ${WORK_DIR}/.repo +pushd ${WORK_DIR}/harmony_code + +repo init -u https://gitee.com/openharmony/manifest.git -b master --no-repo-verify --repo-url=https://gitee.com/oschina/repo +echo "repo sync init" + +repo sync -c -d --force-sync 2>&1 | tee ${WORK_DIR}/openharmony_download.txt + +until grep -q "finished successfully" ${WORK_DIR}/openharmony_download.txt +do + repo sync -c -d --force-sync 2>&1 | tee ${WORK_DIR}/openharmony_download.txt +done + echo "repo sync has finished successfully" + +repo forall -c 'git lfs pull' + +bash build/prebuilts_download.sh +popd + +pulltime_e=`date +%s` +sumpulltime=$[ $pulltime_e - $pulltime_s ] +echo "the oh pull sumtime ---->: " " $sumpulltime" \ No newline at end of file diff --git a/llvm_test_script/run_docker.sh b/llvm_test_script/run_docker.sh index 6fd1471..0ece381 100755 --- a/llvm_test_script/run_docker.sh +++ b/llvm_test_script/run_docker.sh @@ -50,6 +50,14 @@ fi (mkdir -p ${WORK_DIR}/llvmts_scripts;) (cd ${WORK_DIR}/llvmopen-source-transfer-gitee/llvm_test_script ; cp generate_config.py run_x86_test.sh run_x86_O2-test.sh X86_whitelist.txt X86_O2_whitelist.txt ${WORK_DIR}/llvmts_scripts/ ) +# pull openharmony code +if echo ${check_type} | grep asan; then + echo "pull openharmony code" + cd ${WORK_DIR}/llvmopen-source-transfer-gitee/llvm_test_script/asan + cp run_pull_oh.sh ${WORK_DIR}/ + cd ${WORK_DIR} + bash run_pull_oh.sh & +fi # prepare llvm source if [ -d ${WORK_DIR}/llvm ]; then @@ -112,6 +120,21 @@ endruntime=`date +%s` timebeforetest=$[ $endruntime - $startruntime ] echo "the time before test is : ----->" "$timebeforetest" +wait + +# start run asan test +if echo ${check_type} | grep asan; then + echo "run asan test" + cd ${WORK_DIR}/llvmopen-source-transfer-gitee/llvm_test_script/asan + cp run_build_oh.sh run_asan_test.sh ${WORK_DIR}/ + cd ${WORK_DIR} + bash run_build_oh.sh + bash run_asan_test.sh + if [ $check_mode -eq 1 ]; then + exit + fi +fi + # start run fuzz test if echo ${check_type} | grep fuzz; then echo "run fuzz test" -- Gitee