Cppcheck是一种用于C和C ++ 编程语言的静态代码分析工具。它是一个多功能工具,可以检查非标准代码,由DanielMarjamäki创立,并担任首席开发人员。Cppcheck是GNU通用公共许可证下的免费软件。

a25504a9ad71512c8be8e6ece5313b9b_original

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 只涵盖了其中的一小部分。没有任何工具可以覆盖整个领域。由于某种工具而导致所有手动测试都被淘汰的那一天还很遥远。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。