如果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文本文件。这部分内容不在这里详细说明,假设你已经准备好了这些环境。
下面开始进入正题。
从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
在Ubuntu系统中用shell脚本来调用cppcheck会非常方便。
我们需要两个脚本。
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/”目录下保存。
(1)Code check and html-report with cppcheck.(链接https://dunterov.github.io/cppcheck/)