Cppcheck 2000 使用 foobar 播放 DSD 音频
介绍
Cppcheck 是一个 C/C++ 代码分析工具。 它提供独特的代码分析来检测错误,并专注于检测未定义的行为和危险的编码结构。 目标是仅检测代码中的真正错误,并尽可能少地生成误报(错误报告的警告)。 Cppcheck 旨在分析您的 C/C++ 代码,即使它具有非标准语法,这在 for ex 中很常见ample 嵌入式项目。
支持的代码和平台:
- Cppcheck 检查包含各种编译器扩展、内联汇编代码等的非标准代码。
- 任何支持 C++11 或更高版本的编译器都应该可以编译 Cppcheck。
- Cppcheck 是跨平台的,用于各种posix/windows/etc 环境。Cppcheck 中的检查并不完美。 应该找到 Cppcheck 无法检测到的错误。
关于静态分析
您可以通过静态分析找到的错误类型有:
- 未定义的行为
- 使用危险的代码模式
- 编码风格
有很多错误是静态分析找不到的。 静态分析工具不知道你的程序打算做什么。 如果您的程序的输出有效但出乎意料,那么在大多数情况下,静态分析工具不会检测到这一点。 例如,如果你的小程序在屏幕上写的是“Helo”而不是“Hello”,那么任何工具都不太可能抱怨这一点。
静态分析应作为质量保证的补充。 它不会取代任何一个;
- 精心设计
- 测试
- 动态分析
- 模糊测试
图形用户界面
这不是必需的,但创建一个新项目 file 是很好的第一步。 您可以调整一些选项以获得良好的结果。 在项目设置对话框中,您看到的第一个选项是“导入项目”。 如果可以,建议您使用此功能。 Cppcheck 可以导入:
- Visual Studio 解决方案/项目
- 编译数据库,可以从 CMake/qbs/etc build 生成 files
- Borland C++ 生成器 6
当您填写完项目设置并单击确定后,将开始 Cppcheck 分析
命令行
这是一些简单的代码:
- int main
- 字符 a[10];a[10] = 0;返回 0;
- 如果你把它保存到 file1.c 并执行:cppcheck file1.c
- Cppcheck 的输出将是:Checking file1.c…[file1.c:4]:(错误)数组 'a[10]' 索引 10 超出范围
检查所有 files在一个文件夹中
通常一个程序有很多源 files。 cppcheck 可以检查所有源 files in a directory:cppcheck path如果“path”是一个文件夹,那么cppcheck会递归检查所有源 files 在这个文件夹中:
- 检查路径/file1.cpp...
- 1/2 file检查完成 50%
- 检查路径/file2.cpp...
- 2/2 file检查完成 100%
查看 files 手动或使用项目 file
使用 Cppcheck 你可以检查 files 手动指定 files/paths 检查和设置。 或者你可以使用构建环境,比如 CMake 或 Visual Studio。我们不知道是哪种方法(项目 file 或手动配置)会给你最好的结果。 建议您两者都尝试。 您可能会得到不同的结果,因此要找到最大数量的错误,您需要同时使用这两种方法。 后面的章节将更详细地描述这一点。
查看 files 匹配给定 file 筛选
和 -file-过滤器= 你可以设置一个 file 过滤器,只有那些 files 匹配过滤器将被检查。 例如ample: 如果你只想检查那些 files 和从子文件夹 src/ 以“test”开头的文件夹,您必须键入:cppcheck src/ –file-filter=src/test*Cppcheck 先收集所有 files 在 src/ 之后将应用过滤器。 所以过滤器必须从给定的开始文件夹开始。
不包括 file 或文件夹从检查 cpp 检查 src/a src/b
排除一个 file 或文件夹,有两种选择。 第一种选择是只提供路径和 file您要查看的:全部 file然后检查 src/a 和 src/b 下的 s。 第二个选项是使用 -i,它指定 files/要忽略的路径。 用这个命令没有 file检查 src/c 中的 s:cppcheck -isrc/c src 此选项仅在提供输入目录时有效。 要忽略多个目录,请分别为每个目录提供 -i 标志。 以下命令忽略 src/b 和 src/c 目录: cppcheck -isrc/b -isrc/c
Clang 解析器(实验性)
默认情况下,Cppcheck 使用内部 C/C++ 解析器。 但是,有一个实验选项可以使用 Clang 解析器。
安装铿锵声。 然后使用 Cppcheck 选项 –clang。
从技术上讲,Cppcheck 将使用其 -ast-dump 选项执行 clang。 然后将 Clang 输出导入并转换为正常的 Cppcheck 格式。 然后对其进行正常的 Cppcheck 分析。
您还可以使用 for ex 将自定义 Clang 可执行文件传递给选项amp乐-clang=clang-10。 您也可以通过路径传递它。 在 Windows 上,除非您使用路径,否则它将附加 .exe 扩展名。
严重性
消息的可能严重性是:
错误
执行代码时,存在未定义的行为或其他错误,例如内存泄漏或资源泄漏
警告
执行代码时可能存在未定义的行为
风格
风格问题,例如未使用的函数、冗余代码、常量、运算符优先级、可能的错误。
表现
基于常识的运行时性能建议,但不确定通过修复这些消息是否会实现任何可测量的速度差异。
可移植性
可移植性警告。 实现定义的行为。 64 位可移植性。 一些可能“如你所愿”的未定义行为等。
信息
配置问题,与语法正确性无关,但可以改进使用的 Cppcheck 配置。
模板代码可能的加速分析
Cppcheck 在您的代码中实例化模板。
如果您的模板是递归的,这可能会导致使用大量内存的缓慢分析。 当存在潜在问题时,cppcheck 将写入信息消息。
Examp代码:
- 模板无效 a()a ();void foo()a<1>();
Cppcheck 输出:
- test.cpp:4:5:信息:TemplateSimplifier:模板“a<100>”达到最大模板递归 (101)。 您可能想要限制 Cppcheck 递归。 [模板递归]a (); ^
如您所见,Cppcheck 实例化了一个直到达到 a<1> 然后它退出。要限制模板递归,您可以:
- 添加模板专业化
- 配置Cppcheck,可以在GUI项目中完成 file 对话框前amp具有模板专业化的文件代码:
- 模板无效 a()aa (); void foo() a<1>();#ifdef __cppcheck__ template<> void a<0>() {}#endif你可以在检查这段代码的时候传入-D__cppcheck__。
Cppcheck 构建文件夹
使用 Cppcheck 构建文件夹不是强制性的,但建议这样做。 Cppcheck 将分析仪信息保存在该文件夹中。
优势tag是;
- 它加快了分析速度,因为它使增量分析成为可能。 只改变了 file重新检查时会分析 s。
- 使用多个线程时也可以进行整个程序分析。
- 在命令行上,您可以通过 –cppcheck-build-dir=path 进行配置。
- 在 GUI 中,它在项目设置中进行配置。
导入项目
您可以导入一些项目 files 并将配置构建到 Cppcheck 中。
Cppcheck GUI 项目
您可以导入和使用 Cppcheck GUI 项目 files 在命令行工具中:cppcheck –project=foobar.cppcheckCppcheck GUI 有几个选项在命令行中没有直接可用。 要使用这些选项,您可以导入 GUI 项目 file. 命令行工具的使用有意保持简单,因此选项有限。 要忽略项目中的某些文件夹,您可以使用 -i。 这里会跳过源码的分析 files 在 foo 文件夹中。cppcheck –project=foobar.cppcheck -ifoo
CMake
生成编译数据库:cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON。
这 file compile_commands.json 在当前文件夹中创建。 现在像这样运行 Cppcheck:cppcheck –project=compile_commands.json
要忽略某些文件夹,您可以使用 -i。 这里会跳过源码的分析 files 在 foo 文件夹中。cppcheck –project=compile_commands.json -ifoo
Visual Studio
您可以在单个项目上运行 Cppcheck files (*.vcxproj) 或在整个解决方案上 (*.sln) 在整个 Visual Studio 解决方案上运行 Cppcheck:cppcheck –project=foobar.son 在 Visual Studio 项目上运行 Cppcheck:cppcheck –project=foobar.vcxproj这两个选项都会分析项目中的所有可用配置。 限制单个配置:cppcheck –project=foobar.sln “–project-configuration=Release|Win32”在 Cppcheck GUI 中,您可以选择仅分析单个调试配置。 如果您想在命令行上使用此选项,则创建一个激活此选项的 Cppcheck GUI 项目,然后导入 GUI 项目 file 在命令行上。 要忽略项目中的某些文件夹,您可以使用 -i。 这将跳过对源的分析 files 在 foo 文件夹中。cppcheck –project=foobar.vcxproj -ifoo
C++ 生成器 6
在 C++ Builder 6 项目上运行 Cppcheck:cppcheck –project=foobar.bpr 要忽略项目中的某些文件夹,您可以使用 -i。 这将跳过对源的分析 files 在 foo 文件夹中。cppcheck –project=foobar.bpr -ifoo
其他
如果您可以生成编译数据库,则可以在 Cppcheck 中导入该数据库。 在 Linux 中,您可以使用例如 bear(build ear)实用程序从任意构建工具生成已编译的数据库:bear make
预处理器设置
如果你使用 –project 那么 Cppcheck 将自动使用导入项目中的预处理器设置 file 并且可能您不必配置任何额外的东西。如果您不使用 –project 则可能需要一些手动预处理器配置。 但是 Cppcheck 具有定义的自动配置。
预处理器的自动配置定义
Cppcheck 自动测试预处理器定义的不同组合,以在分析中实现尽可能高的覆盖率。 这里有一个 file 有 3 个错误(当分配 x、y、z 时)。标志 -D 告诉 Cppcheck 已定义名称。 没有这个定义就没有 Cppcheck 分析。 标志 -U 告诉 Cppcheck 未定义名称。 此定义不会进行 Cppcheck 分析。 标志 –force 和 –max-configs 用于控制检查的组合数量。 当使用 -D 时,Cppcheck 将只检查 1 个配置,除非这些配置被使用。
包括路径
要添加包含路径,请使用 -I,后跟路径。Cppcheck 的预处理器基本上像任何其他预处理器一样处理包含。 然而,当其他预处理器在遇到缺少的标头时停止工作时,Cppcheck 只会打印一条信息消息并继续解析代码。 此行为的目的是 Cppcheck 无需查看整个代码即可工作。 实际上,建议不要给出所有包含路径。 虽然 Cppcheck 在检查其成员的实现时查看类的声明很有用,但不鼓励传递标准库头文件,因为分析不会完全工作并导致更长的检查时间。 对于这种情况,.cfg files 是向 Cppcheck 提供有关函数和类型的实现信息的首选方式,有关更多信息,请参见下文。
平台
您应该使用与您的目标环境相匹配的平台配置。默认情况下,Cppcheck 使用本地平台配置,如果您的代码在本地编译和执行,则效果很好。Cppcheck 具有适用于 Unix 和 Windows 目标的内置配置。 您可以轻松地将它们与 –platform 命令行标志一起使用。 您还可以在 XML 中创建自己的自定义平台配置 file.
C/C++ 标准
在命令行上使用 –std 指定 C/C++ 标准。Cppcheck 假定代码与最新的 C/C++ 标准兼容,但可以覆盖它。 可用的选项有:
- c89:C 代码与 C89 兼容
- c99:C 代码与 C99 兼容
- c11:C 代码与 C11 兼容(默认)
- c++03:C++ 代码与 C++03 兼容
- c++11:C++ 代码与 C++11 兼容
- c++14:C++ 代码与 C++14 兼容
- c++17:C++ 代码与 C++17 兼容
- c++20:C++ 代码与 C++20 兼容(默认)
cppcheck 构建目录
使用 Cppcheck 构建目录是个好主意。 在命令行上使用 –cppcheck-build-dir。 在 GUI 中,构建目录在项目选项中配置。重新检查代码会快得多。 Cppcheck 不分析未更改的代码。 旧警告从构建目录加载并再次报告。 使用多线程时无法进行全程序分析; 除非您使用 cp-pcheck 构建目录。 例如,未使用的功能警告需要整个程序分析。
抑制
如果您想过滤掉某些错误的产生,那么可以抑制这些错误。 如果您遇到误报,请向 Cppcheck 团队报告,以便修复。
纯文本抑制
错误抑制的格式是其中一种错误 id 是您要抑制的 id。 获取它的最简单方法是使用 –template=gcc 命令行标志。 id 显示在括号中。 这 filename 可以包含通配符 * 或 ?,它们分别匹配任何字符序列或任何单个字符。 建议在所有操作系统上使用“/”作为路径分隔符。 这 file名称必须与 file准确地报告警告中的名称。 例如,如果警告包含相对路径,则抑制必须与该相对路径匹配。
命令行抑制
–suppress= 命令行选项用于在命令行上指定抑制。 前任ample:cppcheck –suppress=memleak:src/file1.cpp源/
抑制 file
您可以创建一个抑制 file 例如ample 如下:Univar // 抑制所有 uninitvar 错误 files// 抑制 memleak 和 exceptNew 中的错误 file 源码/file1.cpp
请注意,您可以在抑制中添加空行和注释 file. 注释必须以 # 或 // 开头,并位于行首,或在禁止行之后。 压制的使用 file 如下:cppcheck –suppressions-list=suppressions.txt src/
XML 抑制
您可以在 XML 中指定抑制 file例如amp文件如下:XML 格式是可扩展的,将来可能会扩展更多的属性。 压制的使用 file 如下:cppcheck –suppress-xml=suppressions.xml src/
内联抑制
也可以通过添加包含特殊关键字的注释直接在代码中添加抑制。 请注意,添加注释会在一定程度上牺牲代码的可读性。 此代码通常会生成错误消息:cppcheck test.c[test.c:3]: (error) Array 'arr[5]' index 10 out of boundsTo activate inline suppresss:cppcheck –inline-suppr test.c
格式
您可以使用:// cppcheck-suppress aaaaSuppressing multiple ids in one comment by using []: // cppcheck-suppress [aaaa, bbbb] 来抑制警告 aaaa
在代码前或同一行注释
注释可以放在代码之前或与代码在同一行。 在代码之前:或与代码在同一行:在这个前ample 有 2 行代码和 1 条抑制注释。 禁止注释仅适用于 1 行:a = b + c;.a 作为向后兼容的特殊情况,如果您在其自己的行上有一个 { 并且之后有一个禁止注释,那么这将禁止当前和下一行。 这个前任ample 将抑制 { 和 a = b + c; 的 abc 警告:
多重抑制
对于一行代码,您可能想要禁止显示多个警告。 有几种选择; 在代码前使用 2 个抑制注释:在代码前使用 1 个抑制注释:在与代码同一行的抑制注释:
符号名称
您可以指定内联抑制仅适用于特定符号:// cppcheck-suppress aaaa symbolName=arr// cppcheck-suppress[aaaa symbolName=arr, bbbb]
关于压制的评论
您可以按如下方式编写有关抑制的评论:// cppcheck-suppress[warningid] some comment// cppcheck-suppress warningid ; 一些评论 // cppcheck-suppress warningid // 一些评论
XML 输出
Cppcheck 可以生成 XML 格式的输出。 使用 –xml 启用此格式。 作为ample 命令检查一个 file 并以 XML 格式输出错误
这元素
每个错误都报告在一个元素。 属性:
id
错误的 id,并且是有效的符号名称
严重程度
错误/警告/样式/性能/便携性/信息
信息
短格式的错误信息
冗长
长格式的错误信息
尚无定论
此属性仅在错误消息不确定时使用
CWE
问题的 CWE ID; 请注意,此属性仅在消息的 CWE ID 已知时使用
这元素
与错误相关的所有位置都与元素。 首先列出主要位置。
属性:
file
file名称,相对路径和绝对路径都可以
file0
来源名称 file (选修的)
线
行号
信息
每个位置的简短信息(可选
重新格式化文本输出
如果您想重新格式化输出以使其看起来不同,那么您可以使用模板。
预定义的输出格式
要获得与 Visual Studio 兼容的输出,您可以使用 –template=vs:cppcheck –template=vs samples/arrayIndexOutOfBounds/bad.c 要获得 gcc 兼容的输出,您可以使用 –template=gcc: cppcheck –template=gcc samples/arrayIndexOutOfBounds/bad.c
用户自定义输出格式(单行)
您可以编写自己的模式。 例如,要获取像传统 gcc 一样格式化的警告消息,可以使用以下格式:输出将如下所示:amples/arrayIndexOutOfBounds/bad.c:6: error: Array 'a[2]' access atindex 2, is out of bounds.A 逗号分隔格式:cppcheck –template=”{file},{line},{severity},{id},{message}”samples/arrayIndexOutOfBounds/bad.c
用户自定义输出格式(多行)
许多警告有多个位置。 前任amp文件代码:在第 3 行有一个可能的空指针取消引用。Cppcheck 可以通过显示额外的位置信息来显示它是如何得出这个结论的。 您需要在命令行中同时使用 –template 和 –template-location,例如ample:警告中的第一行采用--template格式进行格式化。 警告中的其他行由 –template-location 格式格式化。
附加组件
插件是分析 Cppcheck 转储的脚本 files 检查与安全编码标准的兼容性并找出问题。 Cppcheck 与下面列出的一些插件一起分发。
错误处理
misra.py 用于验证是否符合 MISRA C 2012,这是为嵌入式系统开发的一组专有指南,用于避免有问题的代码。该标准是专有的,不允许开源工具分发 Misra 规则文本。 因此不允许 Cppcheck 直接编写规则文本。 允许 Cppcheck 分发规则并显示每个违反规则的 id(例如amp乐,[c2012-21.3])。 也可以编写相应的规则文本,但您需要提供。 要获取规则文本,请从 MISRA 购买 PDF (https://www.misra.org.uk). 如果您从 PDF 中的“附录 A – 指南摘要”中复制规则文本并将其写入文本 file,然后通过使用该文本 file Cppcheck 可以写出正确的警告信息。 看文字如何 file 可以格式化,看看 file此处列出: https://github.com/danmar/cppcheck/blob/main/addons/test/misra/. 您可以使用选项 –rule-texts 来指定您的规则文本 file. 支持规则的完整列表可在 Cppcheck 主页上找到。这将启动所有 Cppcheck 检查并另外调用所选插件提供的特定检查。 一些附加组件需要额外的参数。 您可以配置您希望如何在 json 中执行插件 file. 例如ample 把这个放在misra.json中:然后可以在Cppcheck命令行上执行配置:这样可以创建和管理多个配置 files 用于不同的项目。
库配置
当使用外部库时,例如 WinAPI、POSIX、gtk、Qt 等,Cppcheck 不知道外部函数的行为方式。 然后 Cppcheck 无法检测到各种问题,例如内存泄漏、缓冲区溢出、可能的空指针取消引用等。但这可以通过配置修复 files。 Cppcheck 已经包含多个库的配置。 可以如下所述加载它们。 请注意,C 和 C++ 标准库 std.cfg 的配置是
总是由 cppcheck 加载。 如果您创建或更新配置 file 对于一个流行的图书馆,如果您将其上传给我们,我们将不胜感激。
HTML报告
您可以将 Cppcheck 的 XML 输出转换为 HTML 报告。 你需要 Python 和 pygments 模块(http://pygments.org/)为此工作。 在 Cppcheck 源代码树中有一个文件夹 HTML 报告,其中包含转换 Cppcheck XML 的脚本 file 进入 HTML 输出。
此命令生成帮助屏幕:cppcheck gui/test.cpp –xml 2> err.xml htmlreport/cppcheck-htmlreport –file=err.xml –report-dir=test1V–source-dir=。
文件/资源
![]() |
Cppcheck 2000 使用 foobar 播放 DSD 音频 [pdf] 用户手册 2000 使用 foobar 播放 DSD 音频, 使用 foobar 播放 DSD 音频, 使用 foobar 播放 DSD 音频, 使用 foobar |





