summaryrefslogtreecommitdiffstats
path: root/src/build/tools
diff options
context:
space:
mode:
authorMegan <megan.teo@ibm.com>2019-06-25 15:17:40 -0500
committerDaniel M Crowell <dcrowell@us.ibm.com>2019-09-11 10:53:06 -0500
commit1d4530dac35a6baddf60a3bfd454aac1949f69b6 (patch)
tree5322e1e18208364078d0e0a5f54ecdf48402fe50 /src/build/tools
parentbafe5de9d8b538d978d9955386b5f1fd0ae1d82b (diff)
downloadtalos-hostboot-1d4530dac35a6baddf60a3bfd454aac1949f69b6.tar.gz
talos-hostboot-1d4530dac35a6baddf60a3bfd454aac1949f69b6.zip
Implement Static Analysis with cppcheck
Cppcheck static analysis tool can now be run when compiling by running: make cppcheck And it will always run when committing without stopping the commit if an error is found. This commit suppresses some false positives found in the code. A false positive can be suppressed inline by placing “// cppcheck-suppress syntaxError” in a line before the false positive., e.g.: char arr[5]; // cppcheck-suppress arrayIndexOutOfBounds arr[10] = 0; Change-Id: I9e833a153d6b04df2f8a72cd994e43922c61c2fe RTC: 201451 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/79629 Reviewed-by: Zachary Clark <zach@ibm.com> Reviewed-by: Nicholas E Bofferding <bofferdn@us.ibm.com> Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Daniel M Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/build/tools')
-rwxr-xr-xsrc/build/tools/build-cppcheck95
-rwxr-xr-xsrc/build/tools/pre-commit47
2 files changed, 141 insertions, 1 deletions
diff --git a/src/build/tools/build-cppcheck b/src/build/tools/build-cppcheck
new file mode 100755
index 000000000..8e19ed429
--- /dev/null
+++ b/src/build/tools/build-cppcheck
@@ -0,0 +1,95 @@
+#!/bin/bash -e
+# IBM_PROLOG_BEGIN_TAG
+# This is an automatically generated prolog.
+#
+# $Source: src/build/tools/build-cppcheck $
+#
+# OpenPOWER HostBoot Project
+#
+# Contributors Listed Below - COPYRIGHT 2019
+# [+] International Business Machines Corp.
+#
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# permissions and limitations under the License.
+#
+# IBM_PROLOG_END_TAG
+
+source $PROJECT_ROOT/src/build/citest/etc/cppcheck
+
+update_toolconfig(){
+ echo "commit: $CPPCHECK_COMMIT"
+ echo "gcc version: $(gcc -dumpversion)"
+ echo "S: $(uname -o)"
+ echo "arch: $(uname -m)"
+ echo "$(lsb_release -i)"
+ echo "$(lsb_release -r)"
+}
+
+if [ -n "${OPENPOWER_BUILD}" ]; then
+ exit
+fi
+
+cd $PROJECT_ROOT/src/build/tools
+
+if [[ ! -d "cpptools" ]]; then
+ mkdir cpptools
+fi
+
+cd cpptools
+if [[ ! -d "cppcheck" ]]; then
+ # cppcheck folder does not exist, clone repo for the first time
+ git clone git@github.com:danmar/cppcheck.git
+ cd cppcheck
+ git reset --hard $CPPCHECK_COMMIT #update to cppcheck commit
+ update_toolconfig >.cpp_toollevel
+ SHOULDMAKE=1
+else
+ cd cppcheck
+ if ! cmp -s .cpp_toollevel <(update_toolconfig) ; then
+ # cppcheck repo is not at the
+ # level set in $PROJECT_ROOT/src/build/citest/etc/cppcheck
+ if ! git fetch origin; then
+ cd $PROJECT_ROOT/src/build/tools/cpptools
+ rm -rf cppcheck
+ git clone git@github.com:danmar/cppcheck.git
+ cd cppcheck
+ fi
+ git reset --hard $CPPCHECK_COMMIT
+ update_toolconfig >.cpp_toollevel
+
+ SHOULDMAKE=1
+ fi
+ if [[ ! -f "cppcheck" ]]; then
+ SHOULDMAKE=1
+ fi
+fi
+
+if [ "${SHOULDMAKE}" ]; then
+
+ # Check if CXX is set, if it is not then try to find it with CXXPATH
+ # if CXXPATH does not exist, default to host's g++
+ if [ -z "$CXX" ]; then
+ if [ -z "${CXXPATH}" ]; then
+ export CXX=g++
+ else
+ export CXX=${CXXPATH}/g++
+ fi
+ fi
+
+ make
+
+fi
+
+cd $PROJECT_ROOT
+
+
diff --git a/src/build/tools/pre-commit b/src/build/tools/pre-commit
index 3dc621bb3..e679728c0 100755
--- a/src/build/tools/pre-commit
+++ b/src/build/tools/pre-commit
@@ -6,7 +6,7 @@
#
# OpenPOWER HostBoot Project
#
-# Contributors Listed Below - COPYRIGHT 2011,2017
+# Contributors Listed Below - COPYRIGHT 2011,2019
# [+] International Business Machines Corp.
#
#
@@ -35,3 +35,48 @@ else
echo "For more info run './hb --help'"
exit -1
fi
+
+# Run cppcheck if variable is set, if not exit here
+if [[ $DOCPPCHECK -ne 1 ]]; then
+ exit 0
+fi
+
+echo "Running CPPCHECK"
+
+if git rev-parse --verify HEAD >/dev/null 2>&1
+then
+ against=HEAD
+else
+ # This is the hash of the default empty tree in Git.
+ # If for some reason HEAD is not set, then diff'ing against this is like
+ # diff'ing against the very first commit.
+ against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
+fi
+
+${TOOLSDIR}/build-cppcheck
+CPPCHECKTOOL=${TOOLSDIR}/cpptools/cppcheck/cppcheck
+CPPCHECKFLAGS="--inline-suppr --error-exitcode=1"
+CPPCHECK=" ${CPPCHECKTOOL} ${CPPCHECKFLAGS}"
+
+for file in $(git diff-index --cached $against | \
+ grep -E '[MA].*\.(C|c|cpp|cc|cxx)$' | cut -f 2)
+do
+
+ dir="$(dirname $file)"
+ filename="$(basename $file)"
+
+ # TODO RTC 215692
+ # The following command checks for cppcheck errors. All cppcheck errors are
+ # printed to the terminal and stored to a file .${filename}.cppcheck.
+ set -o pipefail && cd ${dir} && timeout 2m ${CPPCHECK} $filename 2>&1 | tee .${filename}.cppcheck; exit_code=$?; \
+ if [ "$exit_code" -ne 1 ]; then \
+ # If exit code does not equal 1 (which is the error code when a cppcheck
+ # error is found) delete the created .cppcheck file.
+ # Note that time-out fails with error code 127.
+ rm -f .${filename}.cppcheck; \
+ fi
+ cd $PROJECT_ROOT
+
+done
+
+exit 0
OpenPOWER on IntegriCloud