Cppcheck(C/C++静态代码分析工具)
v1.66 绿色中文版- 软件大小:5.97 MB
- 更新日期:2019-07-09 11:57
- 软件语言:简体中文
- 软件类别:编程工具
- 软件授权:免费版
- 软件官网:待审核
- 适用平台:WinXP, Win7, Win8, Win10, WinAll
- 软件厂商:
软件介绍 人气软件 下载地址
Cppcheck是一款C / C ++代码的分析工具,它提供了独特的代码分析来检测错误,并专注于检测未定义的行为和危险的编码结构,目标是仅检测代码中的真实错误(即具有非常少的误报),支持的代码和平台:用户可以检查包含各种编译器扩展,内联汇编代码等的非标准代码;任何处理最新C ++标准的C ++编译器都应该编译Cppcheck;Cppcheck应该在任何具有足够CPU和内存的平台上运行;在使用过程,通过仔细测试软件,用户会发现软件中存在更多错误,而不是使用Cppcheck,通过检测软件,用户可以在软件中找到比使用Cppcheck更多的错误;但是,在测试和检测软件时,Cppcheck仍然可以检测到您遗漏的一些错误。强大又实用,需要的用户可以下载体验
软件功能
1. 自动变量检查
2. 数组的边界检查
3. class类检查
4. 过期的函数,废弃函数调用检查
5. 异常内存使用,释放检查
主要作为编译器对产品后期代码补充检查工具使用
可以对产品的缺陷源代码执行比编译器更加严格的逻辑检查
有效的检查的出代码中明显的错误
软件特色
1. 内存泄漏检查,主要是通过内存引用指针
2. 操作系统资源释放检查,中断,文件描述符等
3. 异常STL 函数使用检查
4. 代码格式错误,以及性能因素检查
其实所谓静态代码检查就是使用一个工具检查我们写的代码是否安全和健壮
是否有隐藏的问题,比如内存泄漏,错配的内存分配和释放,缓冲区溢出等。
它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行。
Cppcheck和PC Lint都是目前比较常用的静态代码分析工具。
安装步骤
1、浏览至此,需要的用户可以点击本网站提供的下载路径下载得到对应的程序安装包
2、通过解压功能将压缩包打开,找到主程序
3、双击主程序即可将应用打开,弹出程序主界面
使用说明
入门
2.1 GUI
这不是必需的,但创建一个新的项目文件是一个很好的第一步。您可以调整一些选项以获得良好的结果。
在项目设置对话框中,您看到的第一个选项是“导入项目”。如果可以,建议您使用此功能。Cppcheck可以导入:
Visual Studio解决方案/项目
编译数据库(可以从cmake / qbs / etc构建文件生成)
Borland C ++ Builder 6
填写项目设置后单击“确定”; Cppcheck分析将开始。
2.2命令行
2.2.1首次测试
这是一个简单的代码
如果将其保存到file1.c并执行:
然后cppcheck的输出将是:
2.2.2检查文件夹中的所有文件
通常,程序有许多源文件。而且你想要检查它们。Cppcheck可以检查目录中的所有源文件:
cppcheck path
如果“path”是文件夹,则cppcheck将递归检查此文件夹中的所有源文件。
2.2.3手动检查文件或使用项目文件
使用Cppcheck,您可以通过指定要检查的文件/路径和设置来手动检查文件。或者您可以使用项目文件(cmake / visual studio / etc)。
我们不知道哪种方法(项目文件或手动配置)会给您带来最好的结果。建议您尝试两者。您可能会得到不同的结果,以便找到使用这两种方法所需的大多数错误。
后面的章节将更详细地描述这一点。
2.2.4从检查中排除文件或文件夹
要排除文件或文件夹,有两个选项。第一个选项是仅提供要检查的路径和文件。
cppcheck src/a src/b
然后检查src / a和src / b下的所有文件。
第二个选项是使用-i,用它指定要忽略的文件/路径。使用此命令,不会检查src / c中的文件:
cppcheck -isrc/c src
此选项当前不适用于该--project选项,仅在提供输入目录时有效。忽略多个目录多次提供-i。以下命令忽略src / b和src / c目录。
cppcheck -isrc/b -isrc/c
2.3严重程度
消息的可能严重性如下:
错误
在发现错误时使用
警告
关于防御性编程的建议,以防止错误
样式
与代码清理相关的样式问题(未使用的函数,冗余代码,常量等)
性能
使代码更快的建议。这些建议仅基于常识。通过修复这些消息,您无法确定是否会在速度方面产生任何可衡量的差异。
可移植性
便携性警告。64位可移植性。代码可能在不同的编译器上有所不同。等等
信息
配置问题。建议仅在配置期间启用这些功能。
3导入项目
您可以将一些项目文件和构建配置导入Cppcheck。
3.1 Cppcheck GUI项目
您可以在命令行工具中导入和使用Cppcheck GUI项目文件:
cppcheck --project=foobar.cppcheck
Cppcheck GUI有一些直接在命令行中不可用的选项。要使用这些选项,您可以导入GUI项目文件。我们希望简化命令行工具的使用,并按意图限制选项。
3.2 CMake
生成编译数据库:
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON .
该文件compile_commands.json在当前文件夹中创建。现在像这样运行Cppcheck:
cppcheck --project=compile_commands.json
3.3 Visual Studio
您可以在单个项目文件(* .vcxproj)或整个解决方案(* .sln)上运行Cppcheck
在整个Visual Studio解决方案上运行Cppcheck:
cppcheck --project=foobar.sln
在Visual Studio项目上运行Cppcheck:
cppcheck --project=foobar.vcxproj
在Cppcheck GUI你可以选择只分析一个调试配置。如果要在命令行上使用此选项,则创建一个Cppcheck GUI激活了该项目的项目,然后在命令行上导入GUI项目文件。
3.4 C ++ Builder 6
在C ++ Builder 6项目上运行Cppcheck:
cppcheck --project=foobar.bpr
3.5其他
如果您可以生成编译数据库,那么可以在Cppcheck中导入它。
在Linux中,您可以使用bear(build ear)实用程序从任意构建工具生成编译数据库:
bear make
4平台
您应该使用与目标匹配的平台配置。
默认情况下,如果您的代码是在本地编译和执行的,则Cppcheck使用本机平台配置。
Cppcheck已经为Unix和Windows目标构建了内置配置。您可以使用--platform命令行标志轻松使用它们。
您还可以在XML文件中创建自己的自定义平台配置。这是一个例子:
5预处理器设置
如果您使用,--project那么Cppcheck将使用导入项目中的预处理器设置。否则,您可能希望配置包含路径,定义等。
5.1定义
这是一个具有2个预处理器配置的文件(已定义A且未定义A):
默认情况下,Cppcheck将检查所有预处理器配置(除了其中包含#error的配置)。因此,默认情况下,上面的代码将使用已A定义和A未定义进行分析。
您可以-D用来改变它。使用时-D,cppcheck默认只检查给定的配置而不是其他任何内容。这就是编译器的工作方式。但您可以使用--force或--max-configs覆盖配置数量。
检查所有配置:
cppcheck file.c
只检查配置A:
cppcheck -DA file.c
定义宏A时检查所有配置
cppcheck -DA --force file.c
另一个有用的标志可能是-U。它告诉Cppcheck没有定义宏。用法示例:
cppcheck -UX file.c
这意味着X没有定义。Cppcheck不会检查定义X时会发生什么。
5.2包含路径
要添加包含路径,请使用-I,然后使用路径。
Cppcheck的预处理器基本上像任何其他预处理器一样处理。但是,当其他预处理器遇到缺少的标头时停止工作,cppcheck将只打印一条信息消息并继续解析代码。
此行为的目的是cppcheck无需查看整个代码即可工作。实际上,建议不要给出所有包含路径。虽然cppcheck在检查其成员的实现时查看类的声明是有用的,但是非常不鼓励传递标准库头,因为它会导致更糟糕的结果和更长的检查时间。对于这种情况,.cfg文件(见下文)是向cppcheck提供有关函数和类型实现的信息的更好方法。
6抑制
如果您想过滤掉某些错误,可以取消这些错误。
请注意,如果您看到误报,那么我们(Cppcheck团队)希望您报告它,以便我们可以修复它。
6.1纯文本抑制
您可以抑制某些类型的错误。这种抑制的格式是:
[error id]:[filename]:[line]
[error id]:[filename2]
[error id]
这error id是你要压制的id。获得它的最简单方法是使用--template = gcc命令行标志。id显示在括号中。
文件名可以包括通配符*或?,它们分别匹配任何字符序列或任何单个字符。建议您在所有操作系统上使用“/”作为路径分隔符。
6.2命令行抑制
该--suppress=命令行选项来指定在命令行上禁止。例:
cppcheck --suppress=memleak:src/file1.cpp src/
6.3文件中的抑制
您可以创建一个抑制文件。例:
// suppress memleak and exceptNew errors in the file src/file1.cpp
memleak:src/file1.cpp
exceptNew:src/file1.cpp
// suppress all uninitvar errors in all files
uninitvar
请注意,您可以在suppressions文件中添加空行和注释。
你可以像这样使用suppressions文件:
cppcheck --suppressions-list=suppressions.txt src/
6.4 XML抑制
您可以在XML文件中指定抑制。示例文件:
uninitvar
src/file1.c
10
var
XML格式是可扩展的,并且可以在将来使用其他属性进行扩展。
你可以像这样使用suppressions文件:
cppcheck --suppress-xml=suppressions.xml src/
6.5内联抑制
通过添加包含特殊关键字的注释,也可以直接在代码中添加抑制。在添加此类注释之前,请考虑牺牲代码可读性。
此代码通常会生成错误消息:
void f() {
char arr[5];
arr[10] = 0;
}
输出是:
cppcheck test.c
[test.c:3]: (error) Array 'arr[5]' index 10 out of bounds
要禁止显示错误消息,可以添加注释:
void f() {
char arr[5];
// cppcheck-suppress arrayIndexOutOfBounds
arr[10] = 0;
}
现在该--inline-suppr标志可用于抑制警告。以这种方式调用cppcheck时没有报告错误:
cppcheck --inline-suppr test.c
您可以指定内联抑制仅适用于特定符号:
// cppcheck-suppress arrayIndexOutOfBounds symbolName=arr
您可以为抑制写注释,但建议使用; 或//指定它们的起始位置:
// cppcheck-suppress arrayIndexOutOfBounds ; some comment
// cppcheck-suppress arrayIndexOutOfBounds // some comment
7 XML输出
Cppcheck可以生成XML格式的输出。使用--xml启用这个格式。
用于检查文件并以XML格式输出错误的示例命令:
cppcheck --xml file1.cpp
这是一份示例报告:
verbose="long error text" inconclusive="true" cwe="312">
7.1所述的元件
每个错误都在元素中报告。属性:
ID
错误的ID。这些始终是有效的符号名称。
严重
错误/警告/风格/性能/便携/信息
味精
短格式的错误消息
详细
长格式的错误消息
尚无定论
仅当错误消息不确定时才使用此属性
CWE
该问题的CWE ID。仅当已知消息的CWE ID时才使用此属性。
7.2所述的元件
与错误相关的所有位置都列出了元素。首先列出主要位置。
属性:
文件
文件名。相对路径和绝对路径都是可能的。
file0
源文件的名称(可选)
线
电话号码
信息
每个位置的简短信息(可选)
8重新格式化文本输出
如果要重新格式化输出以使其看起来不同,则可以使用模板。
8.1预定义的输出格式
要获得Visual Studio兼容输出,您可以使用--template = vs:
cppcheck --template=vs samples/arrayIndexOutOfBounds/bad.c
此输出将如下所示:
Checking samples/arrayIndexOutOfBounds/bad.c ...
samples/arrayIndexOutOfBounds/bad.c(6): error: Array 'a[2]' accessed at index 2, which is out of bounds.
要获得gcc兼容输出,您可以使用--template = gcc:
cppcheck --template=gcc samples/arrayIndexOutOfBounds/bad.c
输出将如下所示:
Checking samples/arrayIndexOutOfBounds/bad.c ...
samples/arrayIndexOutOfBounds/bad.c:6:6: warning: Array 'a[2]' accessed at index 2, which is out of bounds. [arrayIndexOutOfBounds]
a[2] = 0;
^
8.2用户定义的输出格式(单行)
你可以编写自己的模式。例如,要获取格式化为旧gcc的警告消息,可以使用以下格式:
cppcheck --template="{file}:{line}: {severity}: {message}" samples/arrayIndexOutOfBounds/bad.c
输出将如下所示:
Checking samples/arrayIndexOutOfBounds/bad.c ...
samples/arrayIndexOutOfBounds/bad.c:6: error: Array 'a[2]' accessed at index 2, which is out of bounds.
逗号分隔格式:
cppcheck --template="{file},{line},{severity},{id},{message}" samples/arrayIndexOutOfBounds/bad.c
输出将如下所示:
Checking samples/arrayIndexOutOfBounds/bad.c ...
samples/arrayIndexOutOfBounds/bad.c,6,error,arrayIndexOutOfBounds,Array 'a[2]' accessed at index 2, which is out of bounds.
8.3用户定义输出格式(多行)
许多警告都有多个位置。示例代码:
在第3行有一个可能的空指针取消引用.Cppcheck可以通过显示额外的位置信息来显示它是如何得出这个结论的。您需要在命令行中同时使用--template和--template-location。
示例命令:
cppcheck --template="{file}:{line}: {severity}: {message}\n{code}" --template-location="{file}:{line}: note: {info}\n{code}" multiline.c
Cppcheck的输出是:
Checking multiline.c ...
multiline.c:3: warning: Possible null pointer dereference: p
*p = 3;
^
multiline.c:8: note: Assignment 'p=0', assigned value is 0
int *p = 0;
^
multiline.c:9: note: Calling function 'f', 1st argument 'p' value is 0
f(p);
^
multiline.c:3: note: Null pointer dereference
*p = 3;
^
警告中的第一行由--template格式设置。
警告中的其他行由--template-location格式设置。
8.3.1 --template的格式说明符
--template的可用说明符是:
{文件}
文件名
{线}
电话号码
{柱}
列号
{}调用堆栈
写下所有位置。每个位置都以[{file}:{line}]格式编写,位置用 - >分隔。例如,它可能看起来像:[multiline.c:8] - > [multiline.c:9] - > [multiline.c:3]
{定论:文字}
如果警告不确定,则写入给定的文本。给定的文本可以是任何不包含}的任意文本。示例:{不确定:不确定,}
{}严重
错误/警告/风格/性能/便携/信息
{信息}
警告信息
{ID}
警告ID
{码}
真正的代码。
\ t
标签
\ n
新队
\ r
回程
8.3.2 --template-location的格式说明符
可用的说明符--template-location是:
{文件}
文件名
{线}
电话号码
{柱}
列号
{信息}
有关当前位置的信息消息
{码}
真正的代码。
\ t
标签
\ n
新队
\ r
回程
9个附加组件
插件是带有额外检查的脚本。Cppcheck分发了一些插件。
9.1运行插件
插件是单独执行的独立脚本。
要手动运行插件:
cppcheck --dump somefile.c
python misc.py somefile.c.dump
要直接通过Cppcheck运行相同的插件:
cppcheck --addon=misc.py somefile.c
一些插件需要额外的参数。例如,misra.py可以像这样手动执行:
cppcheck --dump somefile.c
python misra.py --rule-texts=misra.txt somefile.c.dump
您可以配置在json文件中执行插件的方式,例如将其放在misra.json中:
{
"script": "misra.py",
"args": [ "--rule-texts=misra.txt" ]
}
然后可以在cppcheck命令行上执行配置:
cppcheck --addon=misra.json somefile.c
9.2关于插件的帮助
您可以通过查看插件来了解如何使用Cppcheck插件。文件顶部的注释应该有描述。
10库配置
当使用外部库时,例如WinAPI,POSIX,gtk,Qt等,Cppcheck不知道外部函数的行为方式。然后,Cppcheck无法检测到各种问题,例如泄漏,缓冲区溢出,可能的空指针解引用等。但这可以通过配置文件修复。
Cppcheck已包含多个库的配置。它们可以如下所述加载。请注意,C和C ++的标准库std.cfg的配置始终由cppcheck加载。如果您为热门图书馆创建或更新配置文件,我们将非常感谢您将其上传给我们。
10.1使用您自己的自定义.cfg文件
您可以为项目创建和使用自己的.cfg文件。使用--check-library并--enable=information获取有关应配置内容的提示。
您可以使用Library Editor在Cppcheck GUI编辑配置文件。它在View菜单中提供。
.cfg文件格式记录在Reference: Cppcheck .cfg format(http://cppcheck.sf.net/reference-cfg-format.pdf)文档中。
11 HTML报告
您可以将cppcheck的XML输出转换为HTML报告。你需要Python和pygments模块(http://pygments.org/)来实现这个目的。在Cppcheck源代码树中,有一个文件夹htmlreport,其中包含一个脚本,用于将Cppcheck XML文件转换为HTML输出。
此命令生成帮助屏幕:
htmlreport/cppcheck-htmlreport -h
输出屏幕显示:
Usage: cppcheck-htmlreport [options]
Options:
-h, --help show this help message and exit
--file=FILE The cppcheck xml output file to read defects from.
Default is reading from stdin.
--report-dir=REPORT_DIR
The directory where the html report content is written.
--source-dir=SOURCE_DIR
Base directory where source code files can be found.
示例用法:
./cppcheck gui/test.cpp --xml 2> err.xml
htmlreport/cppcheck-htmlreport --file=err.xml --report-dir=test1 --source-dir=.
人气软件
-
redis desktop manager2020.1中文 32.52 MB
/简体中文 -
s7 200 smart编程软件 187 MB
/简体中文 -
GX Works 2(三菱PLC编程软件) 487 MB
/简体中文 -
CIMCO Edit V8中文 248 MB
/简体中文 -
JetBrains DataGrip 353 MB
/英文 -
Dev C++下载 (TDM-GCC) 83.52 MB
/简体中文 -
TouchWin编辑工具(信捷触摸屏编程软件) 55.69 MB
/简体中文 -
信捷PLC编程工具软件 14.4 MB
/简体中文 -
TLauncher(Minecraft游戏启动器) 16.95 MB
/英文 -
Ardublock中文版(Arduino图形化编程软件) 2.65 MB
/简体中文