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:
parent
5070fcd9d0
commit
25d82ec47f
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user