diff options
author | Megan <megan.teo@ibm.com> | 2019-06-25 15:17:40 -0500 |
---|---|---|
committer | Daniel M Crowell <dcrowell@us.ibm.com> | 2019-09-11 10:53:06 -0500 |
commit | 1d4530dac35a6baddf60a3bfd454aac1949f69b6 (patch) | |
tree | 5322e1e18208364078d0e0a5f54ecdf48402fe50 /src/build | |
parent | bafe5de9d8b538d978d9955386b5f1fd0ae1d82b (diff) | |
download | talos-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')
-rw-r--r-- | src/build/beam/core/assert.C | 6 | ||||
-rw-r--r-- | src/build/beam/core/pagemgr.C | 5 | ||||
-rw-r--r-- | src/build/beam/core/stacksegment.C | 5 | ||||
-rw-r--r-- | src/build/beam/hwp/mvpdRingFuncs.C | 5 | ||||
-rw-r--r-- | src/build/beam/i2c/i2c.C | 6 | ||||
-rw-r--r-- | src/build/beam/prdf/prdfBitKey.C | 5 | ||||
-rw-r--r-- | src/build/beam/prdf/prdfPegasusConfigurator.C | 5 | ||||
-rw-r--r-- | src/build/beam/targeting/targetservice.C | 5 | ||||
-rw-r--r-- | src/build/citest/etc/cppcheck | 27 | ||||
-rwxr-xr-x | src/build/citest/setup-env | 1 | ||||
-rw-r--r-- | src/build/mkrules/cc.rules.mk | 41 | ||||
-rwxr-xr-x | src/build/tools/build-cppcheck | 95 | ||||
-rwxr-xr-x | src/build/tools/pre-commit | 47 |
13 files changed, 244 insertions, 9 deletions
diff --git a/src/build/beam/core/assert.C b/src/build/beam/core/assert.C index c7186668f..183e1847d 100644 --- a/src/build/beam/core/assert.C +++ b/src/build/beam/core/assert.C @@ -5,7 +5,9 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* COPYRIGHT International Business Machines Corp. 2014 */ +/* Contributors Listed Below - COPYRIGHT 2014,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. */ @@ -20,5 +22,7 @@ /* permissions and limitations under the License. */ /* */ /* IBM_PROLOG_END_TAG */ +// cppcheck-suppress syntaxError >>>ERROR5___assert_d9b551657c952063 + >>>ERROR5___assert_941b08c17c952063 diff --git a/src/build/beam/core/pagemgr.C b/src/build/beam/core/pagemgr.C index 54779d750..2cde4394d 100644 --- a/src/build/beam/core/pagemgr.C +++ b/src/build/beam/core/pagemgr.C @@ -5,7 +5,9 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* COPYRIGHT International Business Machines Corp. 2014 */ +/* Contributors Listed Below - COPYRIGHT 2014,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. */ @@ -20,5 +22,6 @@ /* permissions and limitations under the License. */ /* */ /* IBM_PROLOG_END_TAG */ +// cppcheck-suppress syntaxError >>>MISTAKE5__initialize_7639026bb95510e7 >>>MISTAKE5__initialize_2d381016b95510e7 diff --git a/src/build/beam/core/stacksegment.C b/src/build/beam/core/stacksegment.C index cfc2cf308..e7bd9eb21 100644 --- a/src/build/beam/core/stacksegment.C +++ b/src/build/beam/core/stacksegment.C @@ -5,7 +5,9 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* COPYRIGHT International Business Machines Corp. 2014 */ +/* Contributors Listed Below - COPYRIGHT 2014,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. */ @@ -20,4 +22,5 @@ /* permissions and limitations under the License. */ /* */ /* IBM_PROLOG_END_TAG */ +// cppcheck-suppress syntaxError >>>ERROR8_~StackSegment_b791f4a2ac177b6 diff --git a/src/build/beam/hwp/mvpdRingFuncs.C b/src/build/beam/hwp/mvpdRingFuncs.C index 5c113e990..50f58dc83 100644 --- a/src/build/beam/hwp/mvpdRingFuncs.C +++ b/src/build/beam/hwp/mvpdRingFuncs.C @@ -5,7 +5,9 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* COPYRIGHT International Business Machines Corp. 2012,2014 */ +/* Contributors Listed Below - COPYRIGHT 2012,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. */ @@ -20,5 +22,6 @@ /* permissions and limitations under the License. */ /* */ /* IBM_PROLOG_END_TAG */ +// cppcheck-suppress syntaxError >>>MISTAKE17_mbvpdValidateRecordKeyword_d149f58f1505 >>>MISTAKE5_mbvpdRingFunc_b48fca4f6c313e21 diff --git a/src/build/beam/i2c/i2c.C b/src/build/beam/i2c/i2c.C index 6bc1a97f4..1d2632b8f 100644 --- a/src/build/beam/i2c/i2c.C +++ b/src/build/beam/i2c/i2c.C @@ -5,7 +5,9 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* COPYRIGHT International Business Machines Corp. 2014 */ +/* Contributors Listed Below - COPYRIGHT 2014,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. */ @@ -20,4 +22,6 @@ /* permissions and limitations under the License. */ /* */ /* IBM_PROLOG_END_TAG */ +// cppcheck-suppress syntaxError >>>MISTAKE17_i2cSetupMasters_8697e17e1505 + diff --git a/src/build/beam/prdf/prdfBitKey.C b/src/build/beam/prdf/prdfBitKey.C index b1618ebe9..0d9d67938 100644 --- a/src/build/beam/prdf/prdfBitKey.C +++ b/src/build/beam/prdf/prdfBitKey.C @@ -5,7 +5,9 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* COPYRIGHT International Business Machines Corp. 2014 */ +/* Contributors Listed Below - COPYRIGHT 2014,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. */ @@ -20,5 +22,6 @@ /* permissions and limitations under the License. */ /* */ /* IBM_PROLOG_END_TAG */ +// cppcheck-suppress syntaxError >>>MISTAKE17_operator==_f7028aed1505 >>>MISTAKE17_operator==_70cd34271505 diff --git a/src/build/beam/prdf/prdfPegasusConfigurator.C b/src/build/beam/prdf/prdfPegasusConfigurator.C index 956ed90b2..e19a1b881 100644 --- a/src/build/beam/prdf/prdfPegasusConfigurator.C +++ b/src/build/beam/prdf/prdfPegasusConfigurator.C @@ -5,7 +5,9 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* COPYRIGHT International Business Machines Corp. 2014 */ +/* Contributors Listed Below - COPYRIGHT 2014,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. */ @@ -20,5 +22,6 @@ /* permissions and limitations under the License. */ /* */ /* IBM_PROLOG_END_TAG */ +// cppcheck-suppress syntaxError >>>MISTAKE17_addPllDomainsToSystem_954f5e401505 >>>MISTAKE17_addPllDomainsToSystem_c01c04751505 diff --git a/src/build/beam/targeting/targetservice.C b/src/build/beam/targeting/targetservice.C index 4e069351d..029876273 100644 --- a/src/build/beam/targeting/targetservice.C +++ b/src/build/beam/targeting/targetservice.C @@ -5,7 +5,9 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* COPYRIGHT International Business Machines Corp. 2011,2014 */ +/* Contributors Listed Below - COPYRIGHT 2011,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. */ @@ -20,5 +22,6 @@ /* permissions and limitations under the License. */ /* */ /* IBM_PROLOG_END_TAG */ +// cppcheck-suppress syntaxError >>>MISTAKE5_queryMasterProcChipTargetHandle_2745d8d11505 >>>MISTAKE5_queryMasterProcChipTargetHandle_da38b67e1505 diff --git a/src/build/citest/etc/cppcheck b/src/build/citest/etc/cppcheck new file mode 100644 index 000000000..f92ac3604 --- /dev/null +++ b/src/build/citest/etc/cppcheck @@ -0,0 +1,27 @@ +#!/bin/bash +# IBM_PROLOG_BEGIN_TAG +# This is an automatically generated prolog. +# +# $Source: src/build/citest/etc/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 + +export CPPCHECK_COMMIT="4939e0c3086151033bd491bb2df72f7728a4c037" diff --git a/src/build/citest/setup-env b/src/build/citest/setup-env index 21133ef67..e82032d8a 100755 --- a/src/build/citest/setup-env +++ b/src/build/citest/setup-env @@ -26,6 +26,7 @@ export CITESTPATH=${PROJECT_ROOT}/src/build/citest export PATH=${CITESTPATH}:${PATH} +export CXXPATH=/opt/rh/devtoolset-3/root/usr/bin # Determine backing build. export BACKING_BUILD=`cat ${CITESTPATH}/etc/bbuild` diff --git a/src/build/mkrules/cc.rules.mk b/src/build/mkrules/cc.rules.mk index 584b11db4..2d465e2e3 100644 --- a/src/build/mkrules/cc.rules.mk +++ b/src/build/mkrules/cc.rules.mk @@ -54,6 +54,20 @@ $(OBJDIR)/%.o : %.C -o $@.trace $(INCLUDE_DIRS) -iquote . $(C1)$(TRACE_HASHER) $@ $(TRACE_FLAGS) @rm $@.trace + $(C2) " CPPCHECK $(notdir $<)" +# TODO RTC 215692 +# The following script is used to run the cppcheck tool when enabled. If one +# cppcheck error is found, the make process will stop here, the error will be +# printed out to the terminal and stored in a file .`basename $<`.cppcheck in +# the directory where the original file is located + $(C1) set -o pipefail && cd `dirname $<` && timeout 2m $(CXX_CHECK) `basename $<` 2>&1 | tee .`basename $<`.cppcheck; exit_code=$$? ; \ + if [ "$$exit_code" -ne 1 ]; then \ + rm -f .`basename $<`.cppcheck; \ + if [ "$$exit_code" -eq 127 ]; then \ +# Error code 127 means that the command timed-out. We do not fail for timeouts.\ + exit_code=0; \ + fi; \ + fi; exit "$$exit_code" # Compiling *.cc files $(OBJDIR)/%.o : %.cc @@ -63,6 +77,15 @@ $(OBJDIR)/%.o : %.cc $(INCLUDE_DIRS) -iquote . $(C1)$(TRACE_HASHER) $@ $(TRACE_FLAGS) @rm $@.trace + $(C2) " CPPCHECK $(notdir $<)" +# TODO RTC 215692 + $(C1) set -o pipefail && cd `dirname $<` && timeout 2m $(CXX_CHECK) `basename $<` 2>&1 | tee .`basename $<`.cppcheck; exit_code=$$? ; \ + if [ "$$exit_code" -ne 1 ]; then \ + rm -f .`basename $<`.cppcheck; \ + if [ "$$exit_code" -eq 127 ]; then \ + exit_code=0; \ + fi; \ + fi; exit "$$exit_code" $(OBJDIR)/%.o : %.c @@ -73,10 +96,28 @@ ifndef CC_OVERRIDE $(C2) " CC $(notdir $<)" $(C1)$(CC) -c $(call FLAGS_FILTER, $(CFLAGS), $<) $(SOURCE_FILE) \ -o $@.trace $(INCLUDE_DIRS) -iquote . + $(C2) " CPPCHECK $(notdir $<)" +# TODO RTC 215692 + $(C1) set -o pipefail && cd `dirname $<` && timeout 2m $(C_CHECK) `basename $<` 2>&1 | tee .`basename $<`.cppcheck; exit_code=$$? ; \ + if [ "$$exit_code" -ne 1 ]; then \ + rm -f .`basename $<`.cppcheck; \ + if [ "$$exit_code" -eq 127 ]; then \ + exit_code=0; \ + fi; \ + fi; exit "$$exit_code" else $(C2) " CXX $(notdir $<)" $(C1)$(CXX) -c $(call FLAGS_FILTER, $(CXXFLAGS), $<) $(SOURCE_FILE) \ -o $@.trace $(INCLUDE_DIRS) -iquote . + $(C2) " CPPCHECK $(notdir $<)" +# TODO RTC 215692 + $(C1) set -o pipefail && cd `dirname $<` && timeout 2m $(CXX_CHECK) `basename $<` 2>&1 | tee .`basename $<`.cppcheck; exit_code=$$? ; \ + if [ "$$exit_code" -ne 1 ]; then \ + rm -f .`basename $<`.cppcheck; \ + if [ "$$exit_code" -eq 127 ]; then \ + exit_code=0; \ + fi; \ + fi; exit "$$exit_code" endif $(C1)$(TRACE_HASHER) $@ $(TRACE_FLAGS) @rm $@.trace 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 |