From 5070fcd9d001ace6c4de04a854ae9308c4b206e3 Mon Sep 17 00:00:00 2001 From: linD026 Date: Tue, 14 Sep 2021 00:52:04 +0800 Subject: [PATCH] CI: Run static analysis with Cppcheck (#105) Cppcheck[1] is integrated into CI pipeline for running static analysis. However, Cppcheck is known to report false-positive, and we have to suppress some warnings in advance. [1] https://cppcheck.sourceforge.io/ --- .ci/static-analysis.sh | 32 +++++++++++++++++++++++++++++ .github/workflows/generate_doc.yaml | 2 ++ examples/example_atomic.c | 8 ++++---- examples/ioctl.c | 1 - 4 files changed, 38 insertions(+), 5 deletions(-) create mode 100755 .ci/static-analysis.sh diff --git a/.ci/static-analysis.sh b/.ci/static-analysis.sh new file mode 100755 index 0000000..8604616 --- /dev/null +++ b/.ci/static-analysis.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env bash + +SOURCES=$(find $(git rev-parse --show-toplevel) | egrep "\.(cpp|cc|c|h)\$") + +CPPCHECK=$(which cppcheck) +if [ $? -ne 0 ]; then + echo "[!] cppcheck not installed. Failed to run static analysis the source code." >&2 + exit 1 +fi + +## Suppression list ## +# This list will explain the detail of suppressed warnings. +# The prototype of the item should be like: +# "- [{file}] {spec}: {reason}" +# +# - [hello-1.c] unusedFunction: False positive of init_module and cleanup_module. +# - [*.c] missingIncludeSystem: Focus on the example code, not the kernel headers. + +OPTS=" --enable=warning,style,performance,information + --suppress=unusedFunction:hello-1.c + --suppress=missingIncludeSystem + --std=c89 " + +$CPPCHECK $OPTS --xml ${SOURCES} 2> cppcheck.xml +ERROR_COUNT=$(cat cppcheck.xml | egrep -c "" ) + +if [ $ERROR_COUNT -gt 0 ]; then + echo "Cppcheck failed: error count is $ERROR_COUNT" + cat cppcheck.xml + exit 1 +fi +exit 0 diff --git a/.github/workflows/generate_doc.yaml b/.github/workflows/generate_doc.yaml index 1024bd9..e00910d 100644 --- a/.github/workflows/generate_doc.yaml +++ b/.github/workflows/generate_doc.yaml @@ -44,6 +44,8 @@ jobs: - name: validate coding style and functionality run: | sudo apt-get install -q -y clang-format-11 + sudo apt-get install -q -y cppcheck .ci/check-format.sh + .ci/static-analysis.sh .ci/build-n-run.sh shell: bash diff --git a/examples/example_atomic.c b/examples/example_atomic.c index 4c05af0..02d770f 100644 --- a/examples/example_atomic.c +++ b/examples/example_atomic.c @@ -7,10 +7,10 @@ #define BYTE_TO_BINARY_PATTERN "%c%c%c%c%c%c%c%c" #define BYTE_TO_BINARY(byte) \ - (byte & 0x80 ? '1' : '0'), (byte & 0x40 ? '1' : '0'), \ - (byte & 0x20 ? '1' : '0'), (byte & 0x10 ? '1' : '0'), \ - (byte & 0x08 ? '1' : '0'), (byte & 0x04 ? '1' : '0'), \ - (byte & 0x02 ? '1' : '0'), (byte & 0x01 ? '1' : '0') + ((byte & 0x80) ? '1' : '0'), ((byte & 0x40) ? '1' : '0'), \ + ((byte & 0x20) ? '1' : '0'), ((byte & 0x10) ? '1' : '0'), \ + ((byte & 0x08) ? '1' : '0'), ((byte & 0x04) ? '1' : '0'), \ + ((byte & 0x02) ? '1' : '0'), ((byte & 0x01) ? '1' : '0') static void atomic_add_subtract(void) { diff --git a/examples/ioctl.c b/examples/ioctl.c index 2288e33..c9956df 100644 --- a/examples/ioctl.c +++ b/examples/ioctl.c @@ -10,7 +10,6 @@ #include struct ioctl_arg { - unsigned int reg; unsigned int val; };