Cppcheck是一种用于C和C ++ 编程语言的静态代码分析工具。它是一个多功能工具,可以检查非标准代码,由DanielMarjamäki创立,并担任首席开发人员。Cppcheck是GNU通用公共许可证下的免费软件。
Cppcheck支持编译器本身可能无法涵盖的各种静态检查,这些检查是可以在源代码级别执行静态分析检查。该程序面向严格的静态分析检查,而不是启发式检查。支持的一些检查包括自动变量检查、检查阵列溢出的边界、类检查(如未使用的函数,变量初始化和内存复制)、根据Open Group 使用已弃用或已取代的函数、异常安全检查,例如内存分配和析构函数检查的使用,内存泄漏和资源泄漏等问题。
Cppcheck已被确定用于诸如CERNs 4DSOFT元分析软件包,也用于高能粒子探测器读出设备中的代码验证,也用于射电望远镜的系统监测软件以及大型误差分析等系统中。尽管有许多不寻常的编程习惯用例在特定目标情况下可以接受,但Cppcheck始终在源代码级别对代码执行严格检查,以尽量减少误报。
Cppcheck特征
独特的代码分析可以检测代码中的各种错误。
命令行界面和图形用户界面都可用。
Cppcheck 非常注重检测未定义的行为。
独特的分析
使用多种静态分析工具可能是一个好主意。每个工具都有独特的功能。这已在许多研究中得到证实。
那么Cppcheck有什么独特之处呢。
Cppcheck 使用不健全的流敏感分析。其他一些分析器使用基于抽象解释的路径敏感分析,这也很棒,但既有优点也有缺点。从理论上讲,根据定义,路径敏感分析比流敏感分析更好。但实际上,这意味着 Cppcheck 将检测其他工具无法检测到的错误。
在Cppcheck中,数据流分析不仅是“正向”的,而且是“双向的”。大多数分析仪都会对此进行诊断:
void foo(int x)
{
int buf[10];
if (x == 1000)
buf[x] = 0; // <- ERROR
}
大多数工具都可以确定数组索引将为1000,并且会出现溢出。
Cppcheck 也会对此进行诊断:
void foo(int x)
{
int buf[10];
buf[x] = 0; // <- ERROR
if (x == 1000) {}
}
未定义的行为
- 死指针
- 被零除
- 整数溢出
- 无效的位移操作数
- 无效转化
- STL 的无效使用
- 内存管理
- 空指针取消引用
- 越界检查
- 未初始化的变量
- 写入常量数据
安全
2017 年最常见的安全漏洞类型(CVE 计数)是:
类别 | 数量 | 由 Cppcheck 检测到 |
---|---|---|
缓冲区错误 | 2530 | 一些 |
访问控制不当 | 1366 | 一些(无意的后门) |
信息泄露 | 1426 | 一些(无意的后门) |
权限、特权和访问控制 | 1196 | 一些(无意的后门) |
输入验证 | 968 | No |
使用 Cppcheck 发现的 CVE:
- CVE-2017-1000249:文件:基于堆栈的缓冲区溢出
这是 Thomas Jarosch 使用 Cppcheck 发现的。原因是条件错误。 - CVE-2013-6462:使用 Cppcheck 发现 X.org 中已有 23 年历史的堆栈溢出。
这已在几篇文章中进行了描述(链接)。 - CVE-2012-1147:2.1.0 之前的 expat 中的 readfilemap.c 允许上下文相关的攻击者通过大量精心设计的 XML 文件造成拒绝服务(文件描述符消耗)。
当您搜索“cppcheck CVE”时,会显示这些 CVE。请随意将搜索结果与其他静态分析工具进行比较。
安全专家建议使用静态分析。从安全角度来看,使用多种工具是最好的方法。
编码标准
编码标准 | 开源 | 优质的 | |
---|---|---|---|
Misra C 2012 - 原始规则 | Yes | Yes | |
Misra C 2012 - 修正案 #1 | Yes | Yes | |
Misra C 2012 - 修正案 #2 | Yes | Yes | |
Misra C 2012 - 修正案 #3 | Yes | ||
Misra C 2012 - 修正案 #4 | Yes | ||
Misra C 2012 - 合规报告 | Yes | ||
Misra C 2012 - 规则文本 | 用户提供 | Yes | |
米斯拉 C 2023 | Yes | ||
米斯拉 C++ 2008 | Yes | ||
米斯拉 C++ 2023 | 工作正在进行中 | ||
C证书 | Yes | ||
证书C++ | Yes | ||
奥托萨 | 部分的 |
所有检查
有关 Cppcheck 中所有检查的列表,请参阅:http://sourceforge.net/p/cppcheck/wiki/ListOfChecks。
客户端和插件
Cppcheck 与许多流行的开发工具集成。例如:
- Buildbot - 集成
- CLion - Cppcheck 插件
- 代码::块 - 集成
- CodeDX(软件保障工具)- 集成
- CodeLite - 集成
- CppDepend 5 - 集成
- Eclipse - Cppcheclipse
- gedit - gedit 插件
- github - Codacy 和 SoftaCheck
- Hudson - Cppcheck 插件
- Jenkins - Cppcheck 插件
- KDevelop - 自 v5.1 起集成
- Mercurial (Linux) - 预提交挂钩 - 检查提交时是否有新错误(需要交互式终端)
- QtCreator - Qt 项目工具 (qpt)
- Tortoise SVN - 添加预提交挂钩脚本
- Visual Studio - Visual Studio 插件
- VScode - VScode 插件
其他静态分析工具
使用一组工具比使用一个工具更好。每个工具都有独特的代码分析,因此我们建议您还使用其他工具。
Cppcheck 关注错误而不是风格问题。因此,专注于风格问题的工具可能是一个很好的补充。
Cppcheck 非常努力地避免误报。有时,即使存在许多错误警告,人们也希望检测所有错误,例如,当他们正在开发版本并希望验证是否没有错误时。一个比 Cppcheck 噪音大得多的工具可能是一个很好的补充。
即使是与 Cppcheck 具有相同设计目标的工具也可能是很好的补充。静态分析是一个很大的领域,Cppcheck 只涵盖了其中的一小部分。没有任何工具可以覆盖整个领域。由于某种工具而导致所有手动测试都被淘汰的那一天还很遥远。
评论(0)