blob: c9a356b2539d06d4382959b359d197ca2861a9ac [file] [log] [blame]
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +01001#!/bin/bash
2#-------------------------------------------------------------------------------
3# Copyright (c) 2018-2019, Arm Limited and Contributors. All rights reserved.
4#
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"
75
Minos Galanakisea421232019-06-20 17:11:28 +010076#Enable all additional checks by default
77additional_checklist="all"
78
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +010079#Run cmake to get the compile_commands.json file
80echo
Dean Birch62c4f082020-01-17 16:13:26 +000081echo '******* Generating compile_commands.json ***************'
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +010082echo
83generate_project $(fix_win_path $(get_full_path ./)) "./" "cppcheck" "-DCMAKE_EXPORT_COMPILE_COMMANDS=1 -DTARGET_PLATFORM=AN521 -DCOMPILER=GNUARM"
Minos Galanakisea421232019-06-20 17:11:28 +010084
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
Dean Birch62c4f082020-01-17 16:13:26 +000097 # Do not execute unused function check when running in diff-mode
Minos Galanakisea421232019-06-20 17:11:28 +010098 additional_checklist="style,performance,portability,information,missingInclude"
99 # 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 {
148 echo "cppcheck failed."
149 echo "Check log for errors."
150 exit 1
151}
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
162#Build the external projects to get all headers installed to places from where
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +0100163#tf-m code uses them
164echo
165echo '******* Install external projects to their final place ***************'
166echo
Tamas Ban681834a2019-12-02 11:05:03 +0000167make -j mbedcrypto_mcuboot_lib_install
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +0100168
169#Now run cppcheck.
170echo
171echo '******* checking cppcheck configuration ***************'
172echo
Minos Galanakisea421232019-06-20 17:11:28 +0100173
Dean Birch62c4f082020-01-17 16:13:26 +0000174if [ "$RAW_OUTPUT" == "1" ] ; then
175 cppcheck $CPPCHECK_ARGS --check-config > /dev/null
176else
177 cppcheck $CPPCHECK_ARGS --check-config 2>chk-config.xml
178fi
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +0100179
180echo
181echo '******* analyzing files with cppcheck ***************'
182echo
Dean Birch62c4f082020-01-17 16:13:26 +0000183if [ "$RAW_OUTPUT" == "1" ] ; then
184 cppcheck $CPPCHECK_ARGS > /dev/null
185 echo '******* cppcheck complete ***************'
186else
187 cppcheck $CPPCHECK_ARGS 2>chk-src.xml
188 echo
189 echo '******* Please check chk-config.xml and chk-src.xml for the results. ***************'
190 echo
191fi
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +0100192popd
193