Преглед изворни кода

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
linD026 пре 3 година
родитељ
комит
25d82ec47f
1 измењених фајлова са 62 додато и 29 уклоњено
  1. 62 29
      .ci/static-analysis.sh

+ 62 - 29
.ci/static-analysis.sh

@@ -1,32 +1,65 @@
 #!/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 "</error>" )
-
-if [ $ERROR_COUNT -gt 0 ]; then
-    echo "Cppcheck failed: error count is $ERROR_COUNT"
-    cat cppcheck.xml
-    exit 1
-fi
+function do_cppcheck()
+{
+    local SOURCES=$(find $(git rev-parse --show-toplevel) | egrep "\.(cpp|cc|c|h)\$")
+
+    local 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.
+
+    local OPTS="
+            --enable=warning,style,performance,information
+            --suppress=unusedFunction:hello-1.c
+            --suppress=missingIncludeSystem
+            --std=c89 "
+
+    $CPPCHECK $OPTS --xml ${SOURCES} 2> cppcheck.xml
+    local ERROR_COUNT=$(cat cppcheck.xml | egrep -c "</error>" )
+
+    if [ $ERROR_COUNT -gt 0 ]; then
+        echo "Cppcheck failed: $ERROR_COUNT error(s)"
+        cat cppcheck.xml
+        exit 1
+    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