Skip to content

Commit

Permalink
Implement Static Analysis with cppcheck
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
megteo authored and dcrowell77 committed Sep 11, 2019
1 parent bafe5de commit 1d4530d
Show file tree
Hide file tree
Showing 15 changed files with 265 additions and 9 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Expand Up @@ -23,3 +23,5 @@ gcov_report
lcov_data
standalone/
objdump/
*.cppcheck
cpptools/
19 changes: 19 additions & 0 deletions makefile
Expand Up @@ -45,6 +45,16 @@ IMAGE_PASS_POST += cscope ctags
endif
IMAGE_PASS_POST += check_istep_modules

# Variables used when running cppcheck tool.
# The actual commands are stored in CXX_CHECK and C_CHECK, which are created as
# dummy variables here, but will be set to the actual tool in the "cppcheck" rule
BUILDCPPCHECK := $(PROJECT_ROOT)/src/build/tools/build-cppcheck
CPPCHECKTOOL := $(PROJECT_ROOT)/src/build/tools/cpptools/cppcheck/cppcheck
CPPCHECKFLAGS := --inline-suppr --error-exitcode=1 --template='Error CPPCHECK {file}: line {line}\nSyntax error string: {id}\n{message}'
CPPCHECK := $(CPPCHECKTOOL) $(CPPCHECKFLAGS)
export CXX_CHECK ?= true
export C_CHECK ?= true

include ./config.mk

.PHONY: docs
Expand Down Expand Up @@ -75,6 +85,15 @@ lcov:
genhtml obj/lcov_data -o obj/gcov_report --ignore-errors source
@echo Coverage report now available in obj/gcov_report

.PHONY: cppcheck
cppcheck:
@echo Building with CPPCHECK tool
# TODO RTC: 215692
${BUILDCPPCHECK}
export CXX_CHECK="$(CPPCHECK) $(filter -D%, $(CXXFLAGS)) $(INCFLAGS)" && \
export C_CHECK="$(CPPCHECK) $(filter -D%, $(CFLAGS)) $(INCFLAGS)" && \
${MAKE}

.PHONY: gcda_clean
gcda_clean:
find -name '*.gcda' -exec rm -f {} \;
Expand Down
6 changes: 5 additions & 1 deletion src/build/beam/core/assert.C
Expand Up @@ -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. */
Expand All @@ -20,5 +22,7 @@
/* permissions and limitations under the License. */
/* */
/* IBM_PROLOG_END_TAG */
// cppcheck-suppress syntaxError
>>>ERROR5___assert_d9b551657c952063

>>>ERROR5___assert_941b08c17c952063
5 changes: 4 additions & 1 deletion src/build/beam/core/pagemgr.C
Expand Up @@ -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. */
Expand All @@ -20,5 +22,6 @@
/* permissions and limitations under the License. */
/* */
/* IBM_PROLOG_END_TAG */
// cppcheck-suppress syntaxError
>>>MISTAKE5__initialize_7639026bb95510e7
>>>MISTAKE5__initialize_2d381016b95510e7
5 changes: 4 additions & 1 deletion src/build/beam/core/stacksegment.C
Expand Up @@ -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. */
Expand All @@ -20,4 +22,5 @@
/* permissions and limitations under the License. */
/* */
/* IBM_PROLOG_END_TAG */
// cppcheck-suppress syntaxError
>>>ERROR8_~StackSegment_b791f4a2ac177b6
5 changes: 4 additions & 1 deletion src/build/beam/hwp/mvpdRingFuncs.C
Expand Up @@ -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. */
Expand All @@ -20,5 +22,6 @@
/* permissions and limitations under the License. */
/* */
/* IBM_PROLOG_END_TAG */
// cppcheck-suppress syntaxError
>>>MISTAKE17_mbvpdValidateRecordKeyword_d149f58f1505
>>>MISTAKE5_mbvpdRingFunc_b48fca4f6c313e21
6 changes: 5 additions & 1 deletion src/build/beam/i2c/i2c.C
Expand Up @@ -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. */
Expand All @@ -20,4 +22,6 @@
/* permissions and limitations under the License. */
/* */
/* IBM_PROLOG_END_TAG */
// cppcheck-suppress syntaxError
>>>MISTAKE17_i2cSetupMasters_8697e17e1505

5 changes: 4 additions & 1 deletion src/build/beam/prdf/prdfBitKey.C
Expand Up @@ -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. */
Expand All @@ -20,5 +22,6 @@
/* permissions and limitations under the License. */
/* */
/* IBM_PROLOG_END_TAG */
// cppcheck-suppress syntaxError
>>>MISTAKE17_operator==_f7028aed1505
>>>MISTAKE17_operator==_70cd34271505
5 changes: 4 additions & 1 deletion src/build/beam/prdf/prdfPegasusConfigurator.C
Expand Up @@ -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. */
Expand All @@ -20,5 +22,6 @@
/* permissions and limitations under the License. */
/* */
/* IBM_PROLOG_END_TAG */
// cppcheck-suppress syntaxError
>>>MISTAKE17_addPllDomainsToSystem_954f5e401505
>>>MISTAKE17_addPllDomainsToSystem_c01c04751505
5 changes: 4 additions & 1 deletion src/build/beam/targeting/targetservice.C
Expand Up @@ -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. */
Expand All @@ -20,5 +22,6 @@
/* permissions and limitations under the License. */
/* */
/* IBM_PROLOG_END_TAG */
// cppcheck-suppress syntaxError
>>>MISTAKE5_queryMasterProcChipTargetHandle_2745d8d11505
>>>MISTAKE5_queryMasterProcChipTargetHandle_da38b67e1505
27 changes: 27 additions & 0 deletions 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"
1 change: 1 addition & 0 deletions src/build/citest/setup-env
Expand Up @@ -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`
Expand Down
41 changes: 41 additions & 0 deletions src/build/mkrules/cc.rules.mk
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down
95 changes: 95 additions & 0 deletions 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


0 comments on commit 1d4530d

Please sign in to comment.