通过脚本使用Cppcheck做静态测试并生成报告(Unbuntu)

1.安装cppcheck

如果Ubuntu系统还没有安装cppcheck,则需要先安装。
安装命令:

sudo apt install cppcheck

根据提示操作,直到安装完成。

可以使用下面命令查看cppcheck是否安装。

$ cppcheck --version
Cppcheck 1.90

注:在我们的测试环境下,Ubuntu 20.04 LTS通过“sudo apt install cppcheck”命令默认会安装Cppcheck 1.90版本。

除了安装cppcheck之外,还需要安装python,并且获取到MISRA.txt文本文件。这部分内容不在这里详细说明,假设你已经准备好了这些环境。

下面开始进入正题。

2.关于配置文件misra.json

从1.88版本开始,Cppcheck支持插件(addon)。

可以通过下面的Cppcheck命令调用插件(addon):

cppcheck --addon=misra.py somefile.c

这将启动所有 Cppcheck 检查,并额外调用所选插件提供的特定检查。

一些插件需要额外的参数。我们可以在misra.json文件中配置插件和参数。

{
    "script": "misra.py",
    "args": [
        "--rule-texts=misra.txt"
    ]
}

然后可以在 Cppcheck 命令行上执行配置:

cppcheck --addon=misra.json somefile.c

默认情况下,Cppcheck将在安装过程中指定的标准路径上搜索插件。你也可以直接设置此路径,例如:

cppcheck --addon=”/opt/cppcheck/configurations/my_misra.json” somefile.c

这允许你为不同的项目创建和管理多个配置文件。

第一次使用插件,会遇到很多问题。因为插件的配置文件misra.json很容易出错。

下面是一个可以成功运行的配置文件:

{
   "script": "misra.py",
   "args": [
       "--rule-texts=/opt/cppcheck/configurations/misra2012_rules.txt"
   ]
}

注意:"–rule-texts=***"的路径名必须使用左斜线“/”,而且路径名不能有空格!

我们把misra.json和misra2012_rules.txt放在“/opt/cppcheck/configurations”目录下。你可根据实际需求决定把它们放在哪里。

实际使用过程中,遇到几个问题。
(1)misra2012_rules.txt文件所在路径中不能有空格。否则cppcheck会找不到它们。但是misra.json文件所在的路径可以有空格。
(2)misra.json配置文件中"–rule-texts=***"的路径名必须使用左斜线“/”!如果用右斜线“\”,则会报找不到文件。
(3)cppcheck命令执行时必须使用参数“–enable=all”才能检查到MIRSA违规项,否则检查结果为空白。下面是参数包含“–enable=all”的例子:

cppcheck --enable=all --addon="/opt/cppcheck/configurations/my_misra.json" settings.c

3.使用Cppcheck做静态测试的两个脚本

在Ubuntu系统中用shell脚本来调用cppcheck会非常方便。

我们需要两个脚本。

  • (1) ListGen.sh:遍历指定目录下的.c文件生成文件列表文本文件。
  • (2) CppcheckReport.sh:读取文件列表文件中的.c文件对其做静态测试,把测试结果输出为.xml文件,然后通过cppcheck-htmlreport这个python脚本从.xml文件转换得到html报告。

ListGen.sh内容:

#!/bin/bash

# 遍历目录名
DIRECTORY_NAME="linux-4.10.7"

echo "Get file name for .c in the directory: $DIRECTORY_NAME"

# 获取当前日期和时间
DATETIME=$(date +"%Y%m%d_%H%M%S")

# 构建txt文本文件的文件名
SRC_FILELIST="${DIRECTORY_NAME}_filelist_${DATETIME}.txt"

# 显示文件名
echo "The file list name is: $SRC_FILELIST"

echo "Waiting..."

# 递归地遍历目录下所有的.c文件,把文件名写入txt文本文件
find "$DIRECTORY_NAME" -type f -name "*.c" > "$SRC_FILELIST"

echo "Done."

实例中我们配置set DIRECTORY_NAME=linux-4.10.7。你可以根据需求修改遍历的目录名。执行此脚本结束后,会生成一个以txt文件。然后,请修改此txt文件,从中删除不需要做静态测试的文件,只保留需要做静态测试的文件。最后,请把这个文件命名为“CppcheckReport.bat”脚本中与“set SRC_FILELIST=“.\linux-4.10.7_filelist.txt””一样的名字。

CppcheckReport.sh内容:

#!/bin/bash

# 获取当前日期和时间
DATETIME=$(date +"%Y%m%d_%H%M%S")

# 设置 SRC_CC_REPORT 目录路径
SRC_CC_REPORT="SRC_CC_REPORT"

# 检查 SRC_CC_REPORT 目录是否存在,如果不存在则创建
if [ ! -d "$SRC_CC_REPORT" ]; then
  mkdir "$SRC_CC_REPORT"
fi

# 在 SRC_CC_REPORT 目录下创建 REPORT_YYYYMMDD_HHMMSS 子目录
REPORT_SUB_DIR="$SRC_CC_REPORT/RPT_$DATETIME"
mkdir "$REPORT_SUB_DIR"

CPPCHECK_PATH="/usr/bin/cppcheck"
ADDON_PATH="/opt/cppcheck/configurations/misra.json"

SRC_FILELIST="./linux-4.10.7_filelist.txt"

OUTPUT_XML="static_analysis_output.xml"
CPPCHECK_HTMLREPORT_PATH="/opt/cppcheck/htmlreport/cppcheck-htmlreport"
CPPCHECK_HTMLREPORT_TITLE="My Project"

"$CPPCHECK_PATH" --file-list="$SRC_FILELIST" --xml --enable=all --addon="$ADDON_PATH" 2>"$OUTPUT_XML"

python3 "$CPPCHECK_HTMLREPORT_PATH" --file="$OUTPUT_XML" --title="$CPPCHECK_HTMLREPORT_TITLE" --report-dir="$REPORT_SUB_DIR" --source-dir="."

# 删除xml文件
rm "$OUTPUT_XML"

此脚本会使用cppcheck对“set SRC_FILELIST=“./linux-4.10.7_filelist.txt””文件中的每个文件做静态测试,并将测试结果写到一个xml文件。静态测试结束后,会调用python脚本工具cppcheck-htmlreport把xml转换为html报告。

注:cppcheck-htmlreport工具在cppcheck源代码包里可以找到,我们把它拷贝到“/opt/cppcheck/htmlreport/”目录下保存。

4.参考

(1)Code check and html-report with cppcheck.(链接https://dunterov.github.io/cppcheck/)

你可能感兴趣的:(笔记,cppcheck,MISRA)