blob: 8fb9bf90fe164e1c24561c2dde37c3a003d31fb7 [file] [log] [blame]
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +01001#!/bin/bash
2#-------------------------------------------------------------------------------
Xinyu Zhangd938b912021-04-29 14:06:12 +08003# Copyright (c) 2018-2021, Arm Limited and Contributors. All rights reserved.
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +01004#
5# SPDX-License-Identifier: BSD-3-Clause
6#
7#-------------------------------------------------------------------------------
8
9##
10##@file
11##@brief Execute cppcheck
12##
13##This bash script can be used to execute cppcheck for the tf-m project.
14##It will use the CMake generated "compile_commands.json" file.
15##CMake is executed to generate the build commands for the "default" build
Dean Birch62c4f082020-01-17 16:13:26 +000016##configuration (i.e. no build config file is specified on the command-line).
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +010017##
18##This file shall be executed from the root directory of the tf-m working copy.
19##
20##In order to have all include file in place, some CMake external projects will
21##be built, and thus C build tools for the default build configuration must be
22##available.
23##
24##The script will generate two XML output files:
25##file | description
26##--------|--------
27##chk-config.xml | The result of cppcheck configuration verification.
28##chk-src.xml. | The result of source file verification.
29##
30##@todo The current version of cppcheck seems to ignore command line parameters
31## when using the --project command line switch. As a result it is not
32## possible to define additional macros and include paths on the command
33## line. This results in some incorrect error and warning messages.
34##@todo The file cppcheck/arm-cortex-m.cfg needs to be revised. Some settings
Dean Birch62c4f082020-01-17 16:13:26 +000035## might be invalid, and also a different file may be needed based on
36## used compiler switches (i.e. to match width specification and or default
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +010037## sign for some types).
38##@todo Currently cppcheck is only executed for the default build configuration
39## "ConfigDefault.cmake"for target AN521 of the "top level" project.
Dean Birch62c4f082020-01-17 16:13:26 +000040## This might need to be revised/changed in the future.
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +010041##
42
43#Fail if any command exit with error.
44set -e
45
Dean Birch62c4f082020-01-17 16:13:26 +000046RAW_OUTPUT=0
47
48while getopts "hr" opt ; do
49 case "$opt" in
50 h)
51 echo "Usage: $(basename -- "$0") [-h] [-r] [git_hash]"
52 echo " -r, Raw output. (Default is to create xml reports)."
53 echo " -h, Script help"
54 exit 0
55 ;;
56 r)
57 RAW_OUTPUT=1
58 ;;
59 esac
60done
61
62shift $((OPTIND-1))
63
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +010064#The location from where the script executes
65mypath=$(dirname $0)
66
Minos Galanakisea421232019-06-20 17:11:28 +010067#The cmake_exported project file in json format
Dean Birch62c4f082020-01-17 16:13:26 +000068cmake_commands=compile_commands.json
Minos Galanakisea421232019-06-20 17:11:28 +010069
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +010070. "$mypath/util_cmake.sh"
71
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +010072#Library file for cppcheck
73library_file="$(fix_win_path $(get_full_path $mypath))/cppcheck/arm-cortex-m.cfg"
74suppress_file="$(fix_win_path $(get_full_path $mypath))/cppcheck/tfm-suppress-list.txt"
Xinyu Zhang11df53b2020-12-11 14:26:29 +080075toolchain_file="$(fix_win_path $(get_full_path ./))/toolchain_GNUARM.cmake"
Xinyu Zhangd938b912021-04-29 14:06:12 +080076test_repo="$(fix_win_path $(get_full_path ./))/../tf-m-tests"
77mbedtls_repo="$(fix_win_path $(get_full_path ./))/../mbedtls"
78psa_arch_tests_repo="$(fix_win_path $(get_full_path ./))/../psa-arch-tests"
79mcuboot_repo="$(fix_win_path $(get_full_path ./))/../mcuboot"
80
81#Cmake compile params
82cmake_params="-DCMAKE_EXPORT_COMPILE_COMMANDS=1 -DTFM_PLATFORM=mps2/an521 -DTFM_TOOLCHAIN_FILE=$toolchain_file"
83cmake_params="$cmake_params -DTFM_TEST_REPO_PATH=$test_repo -DMBEDCRYPTO_PATH=$mbedtls_repo"
84cmake_params="$cmake_params -DPSA_ARCH_TESTS_PATH=$psa_arch_tests_repo -DMCUBOOT_PATH=$mcuboot_repo"
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +010085
Minos Galanakisea421232019-06-20 17:11:28 +010086#Enable all additional checks by default
87additional_checklist="all"
88
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +010089#Run cmake to get the compile_commands.json file
90echo
Dean Birch62c4f082020-01-17 16:13:26 +000091echo '******* Generating compile_commands.json ***************'
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +010092echo
Xinyu Zhangd938b912021-04-29 14:06:12 +080093generate_project $(fix_win_path $(get_full_path ./)) "./" "cppcheck" "$cmake_params"
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +010094#Enter the build directory
95bdir=$(make_build_dir_name "./" "cppcheck")
96pushd "$bdir" >/dev/null
Minos Galanakisea421232019-06-20 17:11:28 +010097
Dean Birch62c4f082020-01-17 16:13:26 +000098#The following snippet allows cppcheck to be run differentially against a
Minos Galanakisea421232019-06-20 17:11:28 +010099#commit hash passed as first argument $1. It does not
100#affect the legacy functionality of the script, checking the whole codebase,
101#when called without an argument
102if [[ ! -z "$1" ]]
103 then
Dean Birch62c4f082020-01-17 16:13:26 +0000104 echo "Enabled git-diff mode against hash: $1"
Minos Galanakisea421232019-06-20 17:11:28 +0100105
Xinyu Zhang7de294d2021-03-08 10:09:32 +0800106 # Do not execute unused function check and information check when running in diff-mode
107 additional_checklist="style,performance,portability,missingInclude"
Minos Galanakisea421232019-06-20 17:11:28 +0100108 # Grep will set exit status to 1 if a commit does not contain c/cpp.. files
109 set +e
110 filtered_cmd_f=compile_commands_filtered.json
111 # Get a list of files modified by the commits between the reference and HEAD
112 flist=$(git diff-tree --no-commit-id --name-only -r $1 | grep -E '\S*\.(c|cpp|cc|cxx|inc|h)$')
113 flist=$(echo $flist | xargs)
114 echo -e "[" > $filtered_cmd_f
115 IFS=$' ' read -ra git_flist <<< "${flist}"
116
117 for fl in "${git_flist[@]}"; do
118 echo "Looking for reference of file: $fl"
119
Dean Birch62c4f082020-01-17 16:13:26 +0000120 # dry run the command to see if there any output
121 JSON_CMD=$(grep -B 3 "\"file\": \".*$fl\"" $cmake_commands)
Minos Galanakisea421232019-06-20 17:11:28 +0100122
123 if [ -n "${JSON_CMD}" ]; then
124 command_matched=1
Dean Birch62c4f082020-01-17 16:13:26 +0000125 grep -B 3 "\"file\": \".*$fl\"" $cmake_commands >> $filtered_cmd_f
Minos Galanakisea421232019-06-20 17:11:28 +0100126 echo -e "}," >> $filtered_cmd_f
127 fi
128 done
129 set -e
130
131 # Only continue if files in the patch are included in the build commands
132 if [ -n "${command_matched}" ]; then
133 sed -i '$ d' $filtered_cmd_f
134 echo -e "}\n]" >> $filtered_cmd_f
135
Dean Birch62c4f082020-01-17 16:13:26 +0000136 cat $filtered_cmd_f > $cmake_commands
Minos Galanakisea421232019-06-20 17:11:28 +0100137 else
Minos Galanakisea421232019-06-20 17:11:28 +0100138 echo "CppCheck: Ignoring files not contained in the build config"
Dean Birch62c4f082020-01-17 16:13:26 +0000139 if [ "$RAW_OUTPUT" == "0" ] ; then
140 # Always generate an empty file for other stages of ci expecting one
Dean Birch15c8ffe2020-05-29 13:31:19 +0100141 echo "Files Ignored: $flist"
142 cat <<-EOF > chk-config.xml
143 <?xml version="1.0" encoding="UTF-8"?>
144 <results version="2">
145 <cppcheck version="$(cppcheck --version)"/>
146 <errors>
147 </errors>
148 </results>
149 EOF
150 cp chk-config.xml chk-src.xml
Dean Birch62c4f082020-01-17 16:13:26 +0000151 fi
Minos Galanakisea421232019-06-20 17:11:28 +0100152 exit 0
153 fi
154fi
155
Dean Birch62c4f082020-01-17 16:13:26 +0000156function cppcheck_failed {
Xinyu Zhangb314e102021-03-16 16:36:29 +0800157 echo "cppcheck failed."
158 echo "Check log for errors."
Xinyu Zhang7de294d2021-03-08 10:09:32 +0800159 exit 1
Dean Birch62c4f082020-01-17 16:13:26 +0000160}
Minos Galanakisea421232019-06-20 17:11:28 +0100161
Dean Birch62c4f082020-01-17 16:13:26 +0000162EXTRA_ARGS="--error-exitcode=1"
163if [ "$RAW_OUTPUT" != "1" ] ; then
164 # If not in raw output mode, use xml output.
165 EXTRA_ARGS="--xml"
166else
167 trap cppcheck_failed ERR
168fi
169CPPCHECK_ARGS="$EXTRA_ARGS --enable="$additional_checklist" --library="$library_file" --project=$cmake_commands --suppressions-list="$suppress_file" --inline-suppr"
170
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +0100171#Now run cppcheck.
172echo
173echo '******* checking cppcheck configuration ***************'
174echo
Minos Galanakisea421232019-06-20 17:11:28 +0100175
Dean Birch62c4f082020-01-17 16:13:26 +0000176if [ "$RAW_OUTPUT" == "1" ] ; then
177 cppcheck $CPPCHECK_ARGS --check-config > /dev/null
178else
179 cppcheck $CPPCHECK_ARGS --check-config 2>chk-config.xml
180fi
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +0100181
182echo
183echo '******* analyzing files with cppcheck ***************'
184echo
Dean Birch62c4f082020-01-17 16:13:26 +0000185if [ "$RAW_OUTPUT" == "1" ] ; then
186 cppcheck $CPPCHECK_ARGS > /dev/null
187 echo '******* cppcheck complete ***************'
188else
189 cppcheck $CPPCHECK_ARGS 2>chk-src.xml
190 echo
191 echo '******* Please check chk-config.xml and chk-src.xml for the results. ***************'
192 echo
193fi
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +0100194popd