CI: Integrate the Sparse into the CI pipeline

Sparse[1] is a semantic parser for C language, it can find out the
potential problem of the example code.

[1] https://www.kernel.org/doc/html/latest/dev-tools/sparse.html
This commit is contained in:
linD026 2021-09-15 08:19:43 +08:00
parent 5070fcd9d0
commit 25d82ec47f

View File

@ -1,32 +1,65 @@
#!/usr/bin/env bash #!/usr/bin/env bash
SOURCES=$(find $(git rev-parse --show-toplevel) | egrep "\.(cpp|cc|c|h)\$") function do_cppcheck()
{
local SOURCES=$(find $(git rev-parse --show-toplevel) | egrep "\.(cpp|cc|c|h)\$")
CPPCHECK=$(which cppcheck) local CPPCHECK=$(which cppcheck)
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
echo "[!] cppcheck not installed. Failed to run static analysis the source code." >&2 echo "[!] cppcheck not installed. Failed to run static analysis the source code." >&2
exit 1 exit 1
fi fi
## Suppression list ## ## Suppression list ##
# This list will explain the detail of suppressed warnings. # This list will explain the detail of suppressed warnings.
# The prototype of the item should be like: # The prototype of the item should be like:
# "- [{file}] {spec}: {reason}" # "- [{file}] {spec}: {reason}"
# #
# - [hello-1.c] unusedFunction: False positive of init_module and cleanup_module. # - [hello-1.c] unusedFunction: False positive of init_module and cleanup_module.
# - [*.c] missingIncludeSystem: Focus on the example code, not the kernel headers. # - [*.c] missingIncludeSystem: Focus on the example code, not the kernel headers.
OPTS=" --enable=warning,style,performance,information local OPTS="
--suppress=unusedFunction:hello-1.c --enable=warning,style,performance,information
--suppress=missingIncludeSystem --suppress=unusedFunction:hello-1.c
--std=c89 " --suppress=missingIncludeSystem
--std=c89 "
$CPPCHECK $OPTS --xml ${SOURCES} 2> cppcheck.xml $CPPCHECK $OPTS --xml ${SOURCES} 2> cppcheck.xml
ERROR_COUNT=$(cat cppcheck.xml | egrep -c "</error>" ) local ERROR_COUNT=$(cat cppcheck.xml | egrep -c "</error>" )
if [ $ERROR_COUNT -gt 0 ]; then if [ $ERROR_COUNT -gt 0 ]; then
echo "Cppcheck failed: error count is $ERROR_COUNT" echo "Cppcheck failed: $ERROR_COUNT error(s)"
cat cppcheck.xml cat cppcheck.xml
exit 1 exit 1
fi fi
}
function do_sparse()
{
wget -q http://www.kernel.org/pub/software/devel/sparse/dist/sparse-latest.tar.gz
if [ $? -ne 0 ]; then
echo "Failed to download sparse."
exit 1
fi
tar -xzf sparse-latest.tar.gz
pushd sparse-*/
make sparse || exit 1
sudo make INST_PROGRAMS=sparse PREFIX=/usr install || exit 1
popd
make -C examples C=2 2> sparse.log
local WARNING_COUNT=$(cat sparse.log | egrep -c " warning:" )
local ERROR_COUNT=$(cat sparse.log | egrep -c " error:" )
local COUNT=`expr $WARNING_COUNT + $ERROR_COUNT`
if [ $COUNT -gt 0 ]; then
echo "Sparse failed: $WARNING_COUNT warning(s), $ERROR_COUNT error(s)"
cat sparse.log
exit 1
fi
make -C examples clean
}
do_cppcheck
do_sparse
exit 0 exit 0