blob: 30415c8bc16885dc4fbef98c12a89532768952fa [file] [log] [blame]
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +01001#!/bin/bash
2#-------------------------------------------------------------------------------
Minos Galanakis9c775822020-10-16 14:31:33 +01003# Copyright (c) 2018-2020, 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"
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +010076
Minos Galanakisea421232019-06-20 17:11:28 +010077#Enable all additional checks by default
78additional_checklist="all"
79
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +010080#Run cmake to get the compile_commands.json file
81echo
Dean Birch62c4f082020-01-17 16:13:26 +000082echo '******* Generating compile_commands.json ***************'
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +010083echo
Xinyu Zhang11df53b2020-12-11 14:26:29 +080084generate_project $(fix_win_path $(get_full_path ./)) "./" "cppcheck" "-DCMAKE_EXPORT_COMPILE_COMMANDS=1 -DTFM_PLATFORM=mps2/an521 -DTFM_TOOLCHAIN_FILE=$toolchain_file"
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +010085#Enter the build directory
86bdir=$(make_build_dir_name "./" "cppcheck")
87pushd "$bdir" >/dev/null
Minos Galanakisea421232019-06-20 17:11:28 +010088
Dean Birch62c4f082020-01-17 16:13:26 +000089#The following snippet allows cppcheck to be run differentially against a
Minos Galanakisea421232019-06-20 17:11:28 +010090#commit hash passed as first argument $1. It does not
91#affect the legacy functionality of the script, checking the whole codebase,
92#when called without an argument
93if [[ ! -z "$1" ]]
94 then
Dean Birch62c4f082020-01-17 16:13:26 +000095 echo "Enabled git-diff mode against hash: $1"
Minos Galanakisea421232019-06-20 17:11:28 +010096
Xinyu Zhang7de294d2021-03-08 10:09:32 +080097 # Do not execute unused function check and information check when running in diff-mode
98 additional_checklist="style,performance,portability,missingInclude"
Minos Galanakisea421232019-06-20 17:11:28 +010099 # Grep will set exit status to 1 if a commit does not contain c/cpp.. files
100 set +e
101 filtered_cmd_f=compile_commands_filtered.json
102 # Get a list of files modified by the commits between the reference and HEAD
103 flist=$(git diff-tree --no-commit-id --name-only -r $1 | grep -E '\S*\.(c|cpp|cc|cxx|inc|h)$')
104 flist=$(echo $flist | xargs)
105 echo -e "[" > $filtered_cmd_f
106 IFS=$' ' read -ra git_flist <<< "${flist}"
107
108 for fl in "${git_flist[@]}"; do
109 echo "Looking for reference of file: $fl"
110
Dean Birch62c4f082020-01-17 16:13:26 +0000111 # dry run the command to see if there any output
112 JSON_CMD=$(grep -B 3 "\"file\": \".*$fl\"" $cmake_commands)
Minos Galanakisea421232019-06-20 17:11:28 +0100113
114 if [ -n "${JSON_CMD}" ]; then
115 command_matched=1
Dean Birch62c4f082020-01-17 16:13:26 +0000116 grep -B 3 "\"file\": \".*$fl\"" $cmake_commands >> $filtered_cmd_f
Minos Galanakisea421232019-06-20 17:11:28 +0100117 echo -e "}," >> $filtered_cmd_f
118 fi
119 done
120 set -e
121
122 # Only continue if files in the patch are included in the build commands
123 if [ -n "${command_matched}" ]; then
124 sed -i '$ d' $filtered_cmd_f
125 echo -e "}\n]" >> $filtered_cmd_f
126
Dean Birch62c4f082020-01-17 16:13:26 +0000127 cat $filtered_cmd_f > $cmake_commands
Minos Galanakisea421232019-06-20 17:11:28 +0100128 else
Minos Galanakisea421232019-06-20 17:11:28 +0100129 echo "CppCheck: Ignoring files not contained in the build config"
Dean Birch62c4f082020-01-17 16:13:26 +0000130 if [ "$RAW_OUTPUT" == "0" ] ; then
131 # Always generate an empty file for other stages of ci expecting one
Dean Birch15c8ffe2020-05-29 13:31:19 +0100132 echo "Files Ignored: $flist"
133 cat <<-EOF > chk-config.xml
134 <?xml version="1.0" encoding="UTF-8"?>
135 <results version="2">
136 <cppcheck version="$(cppcheck --version)"/>
137 <errors>
138 </errors>
139 </results>
140 EOF
141 cp chk-config.xml chk-src.xml
Dean Birch62c4f082020-01-17 16:13:26 +0000142 fi
Minos Galanakisea421232019-06-20 17:11:28 +0100143 exit 0
144 fi
145fi
146
Dean Birch62c4f082020-01-17 16:13:26 +0000147function cppcheck_failed {
Xinyu Zhangb314e102021-03-16 16:36:29 +0800148 echo "cppcheck failed."
149 echo "Check log for errors."
Xinyu Zhang7de294d2021-03-08 10:09:32 +0800150 exit 1
Dean Birch62c4f082020-01-17 16:13:26 +0000151}
Minos Galanakisea421232019-06-20 17:11:28 +0100152
Dean Birch62c4f082020-01-17 16:13:26 +0000153EXTRA_ARGS="--error-exitcode=1"
154if [ "$RAW_OUTPUT" != "1" ] ; then
155 # If not in raw output mode, use xml output.
156 EXTRA_ARGS="--xml"
157else
158 trap cppcheck_failed ERR
159fi
160CPPCHECK_ARGS="$EXTRA_ARGS --enable="$additional_checklist" --library="$library_file" --project=$cmake_commands --suppressions-list="$suppress_file" --inline-suppr"
161
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +0100162#Now run cppcheck.
163echo
164echo '******* checking cppcheck configuration ***************'
165echo
Minos Galanakisea421232019-06-20 17:11:28 +0100166
Dean Birch62c4f082020-01-17 16:13:26 +0000167if [ "$RAW_OUTPUT" == "1" ] ; then
168 cppcheck $CPPCHECK_ARGS --check-config > /dev/null
169else
170 cppcheck $CPPCHECK_ARGS --check-config 2>chk-config.xml
171fi
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +0100172
173echo
174echo '******* analyzing files with cppcheck ***************'
175echo
Dean Birch62c4f082020-01-17 16:13:26 +0000176if [ "$RAW_OUTPUT" == "1" ] ; then
177 cppcheck $CPPCHECK_ARGS > /dev/null
178 echo '******* cppcheck complete ***************'
179else
180 cppcheck $CPPCHECK_ARGS 2>chk-src.xml
181 echo
182 echo '******* Please check chk-config.xml and chk-src.xml for the results. ***************'
183 echo
184fi
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +0100185popd