blob: de9674831a2693a85b115bc349ddcd569d2e5a9f [file] [log] [blame]
dongqing.li154e45e2021-11-22 07:47:38 +00001#!/bin/bash
2#
dongqing.li594791b2022-09-30 11:18:01 +08003# =============================================================================
4# @Module: BootLoader coverity check
5# @Author: Li Dongqing (dongqing.li@amlogic.com)
6# @License: Copyright (c) 2019 Amlogic, Inc. All rights reserved.
7# @Changes:
8# 1. 2021.11.22 v0.1 - Create bash check_coverity.
9# 2. 2022.09.29 v0.2 - Support run long command
10# =============================================================================
dongqing.li154e45e2021-11-22 07:47:38 +000011
12#############
13# function
14#############
15MK_ARGV=""
16NEW_ARGV=""
dongqing.li8857e062022-09-08 15:54:48 +080017#COVERITY_PATH="/proj/coverity/cov-analysis-linux64-2020.12/bin"
dongqing.li154e45e2021-11-22 07:47:38 +000018COV_IM_DIR="./cov-imdir"
19COV_RESULT_HTML="./result-html"
20HIGH_LEVEL="0"
dongqing.li594791b2022-09-30 11:18:01 +080021DIR_FILTER=""
dongqing.li5849ac72021-11-24 10:49:26 +000022PATTERN_ENABLE="0"
dongqing.li92587aa2022-09-05 21:16:36 +080023IS_CMD_STRING=0
dongqing.li594791b2022-09-30 11:18:01 +080024RUN_BASH=""
25MANUAL_RUN_FLAG=0
dongqing.li154e45e2021-11-22 07:47:38 +000026
27#############
28# function
29#############
30function err_exit()
31{
32 echo "Error: $1"
33 exit 1
34}
35
36function check_cov_path() {
dongqing.li594791b2022-09-30 11:18:01 +080037 echo "[run cov path] : ${MKPATH}"
dongqing.li154e45e2021-11-22 07:47:38 +000038 if [ -d "${COV_IM_DIR}" ]; then
39 rm -rf ${COV_IM_DIR}
40 fi
41 mkdir -p ${COV_IM_DIR}
dongqing.li5849ac72021-11-24 10:49:26 +000042 if [ -d "${COV_RESULT_HTML}" ]; then
43 rm -rf ${COV_RESULT_HTML}
44 fi
dongqing.li154e45e2021-11-22 07:47:38 +000045}
46
dongqing.li594791b2022-09-30 11:18:01 +080047function check_cov_build_version() {
48 COV_CONFIG=`cov-build --help | grep 'Task Reference' -c`
49 if [ "${COV_CONFIG}" = "0" ]; then
50 echo
51 echo -e "\e[1;35m Run cov-build error! Please check: \e[0m"
wenbo.wang3d4d91d2023-07-10 10:45:37 +080052 echo " 1.is installed ? if not, call IT. (/proj/coverity/cov-analysis-linux64-2023.3.2/bin)"
53 echo " 2.in PATH env ? if not, export it.(export PATH=/proj/coverity/cov-analysis-linux64-2023.3.2/bin/:$PATH)"
dongqing.li594791b2022-09-30 11:18:01 +080054 echo
55 exit 0
56 else
57 COV_VERSION=`cov-build --help | grep 'Task Reference' | awk '{print $2}'`
58 echo "check_cov_version: ${COV_VERSION}"
59 fi
60}
61
dongqing.li154e45e2021-11-22 07:47:38 +000062function run_coverity() {
63 echo ""
dongqing.li92587aa2022-09-05 21:16:36 +080064 echo -e "\e[1;35m[1] run cov-build: $@ \e[0m"
dongqing.li594791b2022-09-30 11:18:01 +080065 check_cov_build_version
dongqing.li8857e062022-09-08 15:54:48 +080066 cov-build --dir ${COV_IM_DIR} $@ || err_exit "cov-build error."
dongqing.li5849ac72021-11-24 10:49:26 +000067 echo -e "\e[1;35m[1] run cov-build OK. \e[0m"
dongqing.li92587aa2022-09-05 21:16:36 +080068}
dongqing.li154e45e2021-11-22 07:47:38 +000069
dongqing.li92587aa2022-09-05 21:16:36 +080070function analysis_coverity() {
dongqing.li154e45e2021-11-22 07:47:38 +000071 echo ""
72 echo -e "\e[1;35m[2] run cov-analyze ... \e[0m"
dongqing.li5849ac72021-11-24 10:49:26 +000073 if [ ${HIGH_LEVEL} = "1" ]; then
dongqing.li594791b2022-09-30 11:18:01 +080074 if [ "${PATTERN_ENABLE}" = "1" ];then
75 cov-analyze --dir ${COV_IM_DIR} --strip-path $MKPATH --all --aggressiveness-level high --fb-max-mem 3072 --tu-pattern "file('/${DIR_FILTER}')" || err_exit "cov-analyze high level error."
76 else
dongqing.li8857e062022-09-08 15:54:48 +080077 cov-analyze --dir ${COV_IM_DIR} --strip-path $MKPATH --all --aggressiveness-level high --fb-max-mem 3072 || err_exit "cov-analyze high level error."
dongqing.li5849ac72021-11-24 10:49:26 +000078 fi
79 else
80 if [ "${PATTERN_ENABLE}" = "1" ];then
dongqing.li594791b2022-09-30 11:18:01 +080081 cov-analyze --dir ${COV_IM_DIR} --strip-path $MKPATH --all --tu-pattern "file('/${DIR_FILTER}')" || err_exit "cov-analyze normal level error."
dongqing.li5849ac72021-11-24 10:49:26 +000082 else
dongqing.li8857e062022-09-08 15:54:48 +080083 cov-analyze --dir ${COV_IM_DIR} --strip-path $MKPATH --all || err_exit "cov-analyze normal level error."
dongqing.li5849ac72021-11-24 10:49:26 +000084 fi
85 fi
86 echo -e "\e[1;35m[2] run cov-analyze OK. \e[0m"
dongqing.li154e45e2021-11-22 07:47:38 +000087
dongqing.li5849ac72021-11-24 10:49:26 +000088 echo ""
dongqing.li154e45e2021-11-22 07:47:38 +000089 echo -e "\e[1;35m[3] run cov-format-errors ... \e[0m"
dongqing.li8857e062022-09-08 15:54:48 +080090 cov-format-errors --dir ${COV_IM_DIR} --html-output ${COV_RESULT_HTML} --filesort --strip-path $MKPATH -x || err_exit "cov-format-errors error."
dongqing.li5849ac72021-11-24 10:49:26 +000091 echo -e "\e[1;35m[3] run cov-format-errors OK. \e[0m"
dongqing.li154e45e2021-11-22 07:47:38 +000092 echo "end."
93
dongqing.li594791b2022-09-30 11:18:01 +080094 # show coverity result info
95 show_coverity_result
96
97 if [ "${COVERITY_PUSH}" = "1" ]; then
98 echo ""
99 echo -e "\e[1;35m[4] run cov-commit-defects ... \e[0m"
100 if [ -z ${COVERITY_KEY} -o -z ${COVERITY_STREAM} ]; then
101 echo -e "\e[1;35m[4] --key or --stream is not set, push stream exit ! \e[0m"
102 else
wenbo.wang3d4d91d2023-07-10 10:45:37 +0800103 cov-commit-defects --dir ${COV_IM_DIR} --auth-key-file ${COVERITY_KEY} --host 10.18.11.93 --stream ${COVERITY_STREAM} --noxrefs || err_exit "cov-format-errors error."
dongqing.li594791b2022-09-30 11:18:01 +0800104 echo -e "\e[1;35m[4] run cov-commit-defects OK. \e[0m"
105 echo ""
106 echo -e "\e[1;35m[snapshot-result] \e[0m"
107 echo "you can view the result with the [New snapshot ID] above on coverity server!"
wenbo.wang3d4d91d2023-07-10 10:45:37 +0800108 echo "path: http://10.18.11.93:8080/ -> choose projects -> choose SNAPSHOTS(ALL in Project) -> choose ID"
dongqing.li594791b2022-09-30 11:18:01 +0800109 echo " "
110 fi
111 fi
112
dongqing.li5849ac72021-11-24 10:49:26 +0000113 rm -rf ${COV_IM_DIR}
dongqing.li154e45e2021-11-22 07:47:38 +0000114}
115
116function show_coverity_result() {
117 echo ""
118 echo -e "\e[1;35m[html-result] \e[0m"
dongqing.li5849ac72021-11-24 10:49:26 +0000119 echo "you can open the index.html files through a browser, and view code defects."
dongqing.li154e45e2021-11-22 07:47:38 +0000120 echo "path: ${MKPATH}/`basename ${COV_RESULT_HTML}`/index.html"
121 echo " "
122}
123
124########
125# mk_script.sh call function here !
126########
127function check_coverity() {
128
dongqing.li5849ac72021-11-24 10:49:26 +0000129 MK_ARGV=$@
dongqing.li594791b2022-09-30 11:18:01 +0800130 if [ -z "${DIR_FILTER}" ];then
131 echo "DIR_FILTER not set, ignore. "
dongqing.li5849ac72021-11-24 10:49:26 +0000132 PATTERN_ENABLE="0"
133 else
dongqing.li594791b2022-09-30 11:18:01 +0800134 if [ -e "./${DIR_FILTER}" ];then
135 echo "DIR_FILTER set ok: ${DIR_FILTER}"
dongqing.li5849ac72021-11-24 10:49:26 +0000136 PATTERN_ENABLE="1"
137 else
dongqing.li594791b2022-09-30 11:18:01 +0800138 echo "DIR_FILTER invalid, ingore."
dongqing.li5849ac72021-11-24 10:49:26 +0000139 PATTERN_ENABLE="2"
140 fi
141 fi
dongqing.li154e45e2021-11-22 07:47:38 +0000142
dongqing.li5849ac72021-11-24 10:49:26 +0000143 echo -e "\e[1;35m=========== run check_coverity() ===========\e[0m"
dongqing.li154e45e2021-11-22 07:47:38 +0000144
dongqing.li5849ac72021-11-24 10:49:26 +0000145 echo "------------------------------------------------------------------"
146 echo "coverity raw command : ./mk $@ "
147
148 # check argv
149 result=$(echo ${MK_ARGV} | grep "\-\-cov-high")
150 if [[ "$result" != "" ]]; then
151 echo "coverity defect level : high"
152 HIGH_LEVEL="1"
153 NEW_ARGV=`echo "${MK_ARGV//--cov-high/ }"`
154 else
155 echo "coverity defect level : normal"
156 HIGH_LEVEL="0"
157 NEW_ARGV=`echo "${MK_ARGV//--cov/ }"`
158 fi
159 if [ "PATTERN_ENABLE" != "0" ];then
dongqing.li594791b2022-09-30 11:18:01 +0800160 NEW_ARGV=`echo "${NEW_ARGV//${DIR_FILTER}/ }"`
dongqing.li5849ac72021-11-24 10:49:26 +0000161 fi
162 echo "coverity new command : ./mk ${NEW_ARGV}"
163 MKPATH=`pwd -P`
dongqing.li154e45e2021-11-22 07:47:38 +0000164 echo "coverity run path : $MKPATH"
dongqing.li5849ac72021-11-24 10:49:26 +0000165 echo "------------------------------------------------------------------"
dongqing.li154e45e2021-11-22 07:47:38 +0000166
dongqing.li5849ac72021-11-24 10:49:26 +0000167 # check_cov_path
168 check_cov_path
dongqing.li154e45e2021-11-22 07:47:38 +0000169
dongqing.li5849ac72021-11-24 10:49:26 +0000170 # run_coverity
dongqing.li92587aa2022-09-05 21:16:36 +0800171 run_coverity "./mk ${NEW_ARGV}"
172
173 # analysis coverity
174 analysis_coverity
dongqing.li154e45e2021-11-22 07:47:38 +0000175}
176
dongqing.li92587aa2022-09-05 21:16:36 +0800177#############
178# for bl2/core
179#############
180function sync_code() {
181 #echo "begin sync branch: $1/$2"
182 if [ -z $2 ]; then
183 err_exit "branch($2) error !"
184 fi
185 git reset --hard
186 cnt=`git branch |grep test1 -c`
187 if [ $cnt -eq 0 ]; then
188 git checkout -b test1
189 else
190 git checkout test1
191 fi
192 cnt=`git branch |grep $2 -c`
193 if [ ! $cnt -eq 0 ]; then
194 git branch -D $2 > /dev/null
195 fi
196 git checkout -t $1/$2 || err_exit "git checkout -t $1/$2 faild !"
197 git fetch --all
198 git reset --hard $1/$2
199 git pull
200 git branch -D test1
201 echo
202}
203
204function run_cov_for_bl2_core() {
205 # get all support soc
206 cd ../ree/plat/
dongqing.li8857e062022-09-08 15:54:48 +0800207 array=`ls -d *`
dongqing.li92587aa2022-09-05 21:16:36 +0800208 cd - &> /dev/null
209
dongqing.li8857e062022-09-08 15:54:48 +0800210 skiped=("common" "fvp" "juno" "golden")
dongqing.li92587aa2022-09-05 21:16:36 +0800211 for item in ${skiped[@]}
212 {
213 # remove skiped item
dongqing.li8857e062022-09-08 15:54:48 +0800214 array=${array//${item}/''}
dongqing.li92587aa2022-09-05 21:16:36 +0800215 }
216
dongqing.li8857e062022-09-08 15:54:48 +0800217 RESULT='\n'"Build BL2 core for SoC: "${array[@]}'\n'
dongqing.li92587aa2022-09-05 21:16:36 +0800218 echo -e $RESULT
219
220 # loop all soc
dongqing.li8857e062022-09-08 15:54:48 +0800221 for soc in ${array[@]}
dongqing.li92587aa2022-09-05 21:16:36 +0800222 do
223 TEST_BRANCH=projects/$soc
224 echo "TEST_BRANCH=:$TEST_BRANCH"
225
226 # prepare code
227 sync_code firmware ${TEST_BRANCH}
228
229 # run test
dongqing.li8857e062022-09-08 15:54:48 +0800230 run_coverity ./mk $soc --dusb
231 run_coverity ./mk $soc --dsto
dongqing.li92587aa2022-09-05 21:16:36 +0800232 done
233}
dongqing.li154e45e2021-11-22 07:47:38 +0000234
235function show_help() {
dongqing.li594791b2022-09-30 11:18:01 +0800236 echo
dongqing.li154e45e2021-11-22 07:47:38 +0000237 echo -e "\e[1;35m [usage] \e[0m"
dongqing.li594791b2022-09-30 11:18:01 +0800238 echo " ./check_coverity.sh -c '[cmd_string]'"
239 echo
dongqing.li154e45e2021-11-22 07:47:38 +0000240 echo -e "\e[1;35m [option] \e[0m"
dongqing.li594791b2022-09-30 11:18:01 +0800241 echo " -c : set cmd string, eg: './check.sh' or './mk sc2_ah212 --avb'"
242 echo " -d : set dir filter, eg: 'plat/t3/'(relative path, no prefix './')"
243 echo " -t : set top level mode, could detect more errors."
244 echo " -k : set coverity key, must be used with '-p'"
245 echo " -s : set coverity stream, must be used with '-p'"
246 echo " -p : push coverity result to cov server."
dongqing.li154e45e2021-11-22 07:47:38 +0000247 echo " -h : show help"
dongqing.li594791b2022-09-30 11:18:01 +0800248 echo
dongqing.li154e45e2021-11-22 07:47:38 +0000249 echo -e "\e[1;35m [example] \e[0m"
dongqing.li594791b2022-09-30 11:18:01 +0800250 echo " 1) run coverity with compile cmd"
251 echo " cd bl2/core; ../../fip/check_coverity.sh -c './mk sc2 --dsto'"
252 echo " cd bl2/core; ../../fip/check_coverity.sh -c './mk sc2 --dsto' -d plat/sc2/"
253 echo " 2) quick for [bl2/core]:"
254 echo " bash /path/to/fip/check_coverity.sh -c bl2_core"
255 echo " 3) quick for [bl2/src] [bl2/ree] [bl2/tee] [bl31_1.3/src] [bl32_3.8/src]:"
256 echo " bash /path/to/fip/check_coverity.sh -c ./check.sh"
257 echo " 4) quick for [bl33/v2015] [bl33/v2019]:"
258 echo " bash /path/to/fip/check_coverity.sh -c ./check_compile.sh"
259 echo " 5) run coverity and push result to cov server"
260 echo " bash /path/to/fip/check_coverity.sh -c './mk sc2' -k /path/to/user.key -s bootloader-amlogic-dev-bl2-core -p"
261 echo
dongqing.li92587aa2022-09-05 21:16:36 +0800262 return
dongqing.li154e45e2021-11-22 07:47:38 +0000263}
264
dongqing.li92587aa2022-09-05 21:16:36 +0800265#############
266# main
267#############
dongqing.li154e45e2021-11-22 07:47:38 +0000268function main() {
dongqing.li594791b2022-09-30 11:18:01 +0800269 echo
270 echo "[shell name] : $RUN_BASH"
271 echo "[compile cmd] : $CMD_STRING"
272 if [ ! -z "${DIR_FILTER}" ]; then
273 echo "[pattern path] : $DIR_FILTER"
dongqing.li154e45e2021-11-22 07:47:38 +0000274 fi
275
dongqing.li594791b2022-09-30 11:18:01 +0800276 if [ "${COVERITY_PUSH}" = "1" ]; then
277 echo "[coverity keynum] : $COVERITY_KEY"
278 echo "[coverity stream] : $COVERITY_STREAM"
279 fi
dongqing.li154e45e2021-11-22 07:47:38 +0000280
dongqing.li92587aa2022-09-05 21:16:36 +0800281 if [ $IS_CMD_STRING -eq 1 ]; then
282 # check coverity path
283 check_cov_path
284
285 # run_coverity
dongqing.li594791b2022-09-30 11:18:01 +0800286 if [[ "${CMD_STRING}" = "bl2_core" ]]; then
dongqing.li92587aa2022-09-05 21:16:36 +0800287 run_cov_for_bl2_core
288 else
289 run_coverity ${CMD_STRING}
290 fi
291
292 # analysis coverity
293 analysis_coverity
dongqing.li154e45e2021-11-22 07:47:38 +0000294 fi
dongqing.li594791b2022-09-30 11:18:01 +0800295
296 return
dongqing.li154e45e2021-11-22 07:47:38 +0000297}
298
299#
300# start here.
301#
dongqing.li92587aa2022-09-05 21:16:36 +0800302MKPATH=`pwd -P`
dongqing.li594791b2022-09-30 11:18:01 +0800303
304if [[ "$0" =~ "check_coverity" ]]; then
305 RUN_BASH="$0"
306 if [ $# -gt 0 ]; then
307 MANUAL_RUN_FLAG=1
308 fi
309fi
310
311if [ ${MANUAL_RUN_FLAG} -eq 1 ]; then
312 ARGS=$(getopt -o d:k:s:pth -a -l c:,d:,k:,s:pth -n "check_coverity.sh" -- "$@")
313 if [ $? != 0 ]; then
314 exit 0
315 fi
316
317 eval set -- "$ARGS"
318 while true
319 do
320 case "$1" in
321 -c | --c | --cmd)
322 CMD_STRING="$2"
323 IS_CMD_STRING=1
324 shift 2
325 ;;
326 -d | --dir)
327 DIR_FILTER="$2"
328 if [ -e "./${DIR_FILTER}" ];then
329 PATTERN_ENABLE="1"
330 else
331 PATTERN_ENABLE="2"
332 fi
333 shift 2
334 ;;
335 -t | --top)
336 HIGH_LEVEL="1"
337 shift
338 ;;
339 -k | --key)
340 COVERITY_KEY="$2"
341 shift 2
342 ;;
343 -s | --stream)
344 COVERITY_STREAM="$2"
345 shift 2
346 ;;
347 -p | --push)
348 COVERITY_PUSH="1"
349 shift
350 ;;
351 -h | --help)
352 show_help
353 exit 0
354 ;;
355 --)
356 shift
357 break
358 ;;
359 esac
360 done
361
362 main
363fi