Cppcheck是一款专业的c/c++代码分析软件。如果你需要进行C/C++静态代码分析你可以来试试Cppcheck。它提供独特的代码分析以检测错误,并专注于检测未定义的行为和危险的编码结构。目标是仅检测代码中的实际错误(即,很少有误报)。支持的代码和平台:用户可以检查包含各种编译器扩展,内联汇编代码等的非标准代码;任何处理最新C ++标准的C ++编译器都应编译Cppcheck; Cppcheck应该在任何具有足够CPU和内存运行的平台上;在使用过程中,通过仔细测试软件,用户会发现软件中存在更多错误,而不是使用Cppcheck。通过测试软件,与使用Cppcheck相比,用户可以在软件中发现更多错误;使用该软件时,Cppcheck仍然可以检测到您错过的一些错误。功能强大且实用,需要它的用户可以下载体验。
安装步骤:
1.浏览此处,需要的用户可以单击本网站提供的下载路径下载相应的程序安装包
2.通过解压缩功能打开压缩包并找到主程序
3.双击主程序打开应用程序,程序的主界面将弹出。
软件功能:
1.自动量检查
2.数组边界检查
3.班级检查
4.过期的函数,检查是否有废弃的函数调用
5.内存使用异常,请检查释放
主要用作后期生产代码的编译器补充检查工具
与编译器相比,可以对产品的源代码执行更严格的逻辑检查
有效检查代码中的明显错误
软件功能:
1.内存泄漏检查,主要通过内存引用指针
2.操作系统资源释放检查,中断,文件描述符等。
3. STL功能使用异常检查
4.代码格式错误和性能因素检查
实际上,所谓的静态代码检查就是使用一种工具来检查我们编写的代码是否安全可靠。
否存在隐藏的问题,例如内存泄漏,不匹配的内存分配和释放,缓冲区溢出等。
它可以手动执行以充分发挥人的逻辑思维的优势,也可以在软件工具的帮助下自动执行。
Cppcheck和PC Lint都是常用的静态代码分析工具。
使用说明:
入门
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”是一个文件夹,则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 ++构建器6
在C ++ Builder 6项目上运行Cppcheck:
Cppcheck-项目= foobar.bpr
3.5其他
如果可以生成已编译的数据库,则可以将其导入Cppcheck。
在Linux中,您可以使用bear(构建耳朵)实用程序从任何构建工具生成已编译的数据库:
熊使
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:
Cpcheck -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纯文本抑制
您可以抑制某些类型的错误。这种抑制的格式
s:
[错误ID]:[文件名]:[行]
[错误ID]:[filename2]
[错误ID]
此错误ID是您要取消显示的ID。最简单的方法是使用--template = gcc命令行标志。编号显示在方括号中。
文件名可以包含通配符*或? ,它们分别匹配任何字符序列或任何单个字符。建议在所有操作系统上使用“ /”作为路径分隔符。
6.2命令行抑制
--suppress =命令行选项,用于在命令行上指定禁止显示。例:
Cppcheck --suppress = memleak:src / file1.cpp src /
6.3文件压缩
您可以创建一个禁止文件。例:
//抑制memleak和except文件src / file1.cpp中的新错误
内存泄漏:src / file1.cpp
ExceptNew:src / file1.cpp
//抑制所有文件中的所有uninitvar错误
Uninitvar
请注意,您可以在凹陷文件中添加空白行和注释。
您可以这样使用凹陷文件:
Cppcheck --suppressions-list = pressions.txt s
rc /
6.4 XML抑制
您可以在XML文件中指定抑制。样本文件:
Uninitvar
Src / file1.c
10
Var
XML格式是可扩展的,将来可以用其他属性扩展。
您可以这样使用凹陷文件:
Cppcheck --suppress-xml = pressions.xml src /
6.5内联抑制
通过添加包含特殊关键字的注释,您还可以直接在代码中添加抑制。在添加此类注释之前,请考虑牺牲代码的可读性。
此代码通常生成错误消息:
虚空f(){
Char arr [5];
Arr [10] = 0;
}
输出为:
Cppcheck测试
[Test.c:3] :(错误)数组“ arr [5]”索引10超出范围
要取消显示错误消息,您可以添加评论:
虚空f(){
Char arr [5];
// ppcheck-suppress arrayIndexOutOfBounds
Arr [10] = 0;
}
现在,--inline-suppr标志可用于禁止警告。以这种方式调用cppcheck时,未报告任何错误:
Cppcheck --inline-suppr test.c
您可以指定内联抑制仅适用于某些符号:
// cppcheck-suppress arrayIndexOutOfBounds symbolName = arr
您可以编写注释以进行抑制,但建议使用;或//指定其起始位置:
// cppcheck-suppress arrayIndexOutOfBounds;一些评论
// cppcheck-suppress arrayIndexOutOfBounds //一些注释
7 XML输出
Cppcheck可以生成XML格式的输出。使用--xml启用此格式。
用于检查文件并以XML格式输出错误的示例命令:
Cppcheck --xml文件1.cpp
这是一个示例报告:
详细=“长错误文本”未定=“ true” cwe =“ 312”>
7.1中描述的组件
每个错误都在元素中报告。属性:
ID
ID错误。这些始终是有效的符号名称。
严重
错误/警告/样式/性能/可移植性/信息
味精
短格式错误消息
详情
长格式错误消息
没有定论
仅当错误消息不确定时才使用此属性
CWE
问题的CWE ID。仅当知道消息的CWE ID时才使用此属性。
7.2中描述的组件
在与错误相关的所有位置列出了这些元素。主要位置列在最前面。
属性:
文件
文件名。相对路径和绝对路径都是可能的。
文件0
源文件的名称(可选)
线
电话号码
信息
每个位置的简短信息(可选)
8个重新格式化的文本输出
如果要重新格式化输出以使其看起来不同,则可以使用模板。
8.1预定义的输出格式
要获得与Visual Studio兼容的输出,可以使用--template = vs:
Cppcheck --template = vs样本/ arrayIndexOutOfBounds / bad.c
此输出将如下所示:
正在检查样本/ arrayIndexOutOfBounds / bad.c ...
样本/arrayIndexOutOfBounds/bad.c(6):错误:在索引2处访问数组'a [2]',超出范围。
要获得与gcc兼容的输出,可以使用--template = gcc:
Cppcheck --template = gcc样本/ arrayIndexOutOfBounds / bad.c
输出将如下所示:
正在检查样本/ arrayIndexOutOfBounds / bad.c ...
样本/ arrayIndexOutOfBounds / bad.c:6:6:警告:在索引2处访问数组'a [2]',超出范围。 [ArrayIndexOutOfBounds]
A [2] = 0;
^
8.2用户定义的输出格式(单行)
您可以编写自己的模式。例如,要获取格式为旧gcc的警告消息,可以使用以下格式:
Cppcheck --template =“ {file}:{line}:{severity}:{message}”样本/ arrayIndexOutOfBounds / bad.c
输出将如下所示:
正在检查样本/ arrayIndexOutOfBounds / bad.c ...
样本/ arrayIndexOutOfBounds / bad.c:6:错误:在索引2处访问数组'a [2]',超出范围。
逗号分隔格式:
Cppcheck --template =“ {file},{line},{severity},{id},{message}”样本/ arrayIndexOutOfBounds / bad.c
输出将如下所示:
正在检查样本/ arrayIndexOutOfBounds / bad.c ...
样本/ arrayIndexOutOfBounds / bad.c,6,错误,arrayIndexOutOfBounds,在索引2处访问的数组'a [2]',超出范围。
8.3用户定义的输出格式(多行)
许多警告有多个位置。样例代码:
在第3行上,可能存在空指针取消引用。 Cppcheck可以通过显示其他位置信息来显示得出此结论的方式。您需要在命令行上同时使用--template和--template-location。
示例命令:
cppcheck --template =“ {file}:{line}:{severity}:{message} \ n {code}” --template-loca
tion =“ {file}:{line}:note:{info} \ n {code}” multiline.c
Cppcheck的输出是:
检查multiline.c ...
Multiline.c:3:警告:可能的空指针取消引用:p
* P = 3;
Multiline.c:8:注意:分配'p = 0',分配值为0
Int * p = 0;
^
Multiline.c:9:注意:调用函数“ f”,第一个参数“ p”的值为0
F(p);
^
Multiline.c:3:注意:空指针取消引用
* P = 3;
^
警告的第一行由--template格式设置。
警告中的其他行由--template-location格式设置。
8.3.1-模板格式说明符
-模板的可用说明符为:
{件}
文件名
{线}
电话号码
{柱}
列号
{}调用堆栈
写下所有位置。每个位置均以[{file}:{line}]格式编写,并且位置之间用->分隔。例如,它可能看起来像:[multiline.c:8]-> [multiline.c:9]-> [multiline.c:3]
{结论:文字}
如果警告未定义,请编写给定的文本。给定的文本可以是任何不包含}的文本。示例:{不确定:不确定,}
{} 严重
错误/警告/样式/性能/可移植性/信息
{信息}
警告信息
{ID}
警告ID
{码}
真正的代码。
\ T
标签
\ N
新团队
\ R
回程
8.3.2 --template-location格式说明符
可用的说明符-模板位置为:
{文件}
文件名
{线}
电话号码
{柱}
号
{信息}
有关当前位置的信息消息
{码}
真正的代码。
\ T
标签
\ N
新团队
\ R
程
9个附加组件
插件是带有附加检查的脚本。 Cppcheck分发了一些插件。
9.1运行插件
插件是独立执行的脚本。
要手动运行插件:
Cppcheck-转储somefile.c
Python misc.py somefile.c.dump
要直接通过Cppcheck运行相同的插件:
Cppcheck --addon = misc.py somefile.c
一些插件需要其他参数。例如,可以像下面这样手动执行misra.py:
Cppcheck-转储somefile.c
Python misra.py --rule-texts = misra.txt somefile.c.dump
您可以在json文件中配置执行插件的方式,例如,将其放在misra.json中
{
“脚本”:“ 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 =信息可获得有关应配置内容的提示。
您可以使用库编辑器在Cppcheck GUI中编辑配置文件。它在“查看”菜单中提供。
.cfg文件格式记录在“参考:Cppcheck .cfg格式(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
输出屏幕显示:
用法:cppcheck-htmlreport [选项]
选项:
-H,--help显示此帮助消息并退出
--File = FILE从中读取缺陷的cppcheck xml输出文件。
默认为从标准输入中读取。
--Report-dir = REPORT_DIR
编写html报告内容的目录。
--Source-dir = SOURCE_DIR
可以在其中找到源代码文件的基本目录。
用法示例:
./Cppcheck gui / test.cpp --xml 2> err.xml
htmlreport / cppcheck-htmlreport --file = err.xml --report-dir = test1 --source-dir =