【C/C++ 实用工具】CppCheck:静态代码检测工具,让你的代码更安全

简介: 【C/C++ 实用工具】CppCheck:静态代码检测工具,让你的代码更安全

除了官方GUI,还可支持与多种IDE(如VS、Eclipse、QtCreator)等集成使用.

主要功能:

error:出现的错误

warning:为了预防bug防御性编程建议信息越

style:编码格式问题(没有使用的函数、多余的代码等)

portablity:移植性警告。该部分如果移植到其他平台上,可能出现兼容性问题

performance:建议优化该部分代码的性能

information:一些有趣的信息,可以忽略


  • 检查范围分析:

(1)、自动变量检查;

(2)、数组的边界检查;

(3)、class类检查;

(4)、过期的函数,废弃函数调用检查;

(5)、异常内存使用,释放检查;

(6)、内存泄漏检查,主要是通过内存引用指针;

(7)、操作系统资源释放检查,中断,文件描述符等;

(8)、异常STL 函数使用检查;

(9)、代码格式错误,以及性能因素检查。


支持的检查规则(列举一些):

  1. 禁止在头文件前有可执行代码。
  2. 引起二义性理解的逻辑表达式,必须使用括号显式说明优先级顺序。
  3. 逻辑判别表达式中的运算项必须要使用括号
  4. 禁止对参数指针进行赋值。
  5. 动态分配的指针变量定义时如未被分配空间必须初始化为NULL
  6. 动态分配的指针变量第一次使用前必须进行是否为NULL的判别。
  7. 数组禁止越界使用。
  8. 数组下标必须是大于等于零的整型数。
  9. 禁止使用已被释放了的内存空间。
  10. free的指针必须指向最初malloc、calloc分配的地址。
  11. 建议用宏或const定义常数。
  12. 动态申请的内存空间用完后及时释放
  13. 建议变量在声明的同时进行初始化。
  14. 函数中固定长度数组变量传递必须使用引用方式。
  15. 定义为const的成员函数禁止返回非const的指针或引用。
  16. 禁止可导致非资源性对象数据被外部修改的成员函数返回。
  17. 捕获的顺序必须按由派生类到基类的次序排序
  18. 每个指定的抛出必须有与之匹配的捕获。
  19. 异常抛出的对象必须使用引用方式捕获。
  20. 缺省捕获必须放在所有指定捕获之后
  21. 禁止显式直接抛出

自定义规则:

1. 使用 --suppress 选项过滤特定的警告:

如果你想要忽略某些警告,可以在命令行中使用 --suppress 选项。例如,如果你想要忽略所有的“缺少头文件”的警告,可以使用以下命令:

cppcheck --suppress=missingInclude ./
 
# 这里,“missingInclude” 是要忽略的警告类型。将其替换为您希望过滤掉的警告类型。
  2 .   编写自定义脚本:

在 CppCheck 运行结束后,使用自定义脚本对输出结果进行过滤。例如,您可以使用 Python 编写一个脚本,读取 CppCheck 的输出,然后根据自定义规则筛选警告信息。以下是一个简单的示例:

import subprocess
import sys
 
def main():
    cppcheck_command = "cppcheck --enable=all --xml --xml-version=2 ./"
    result = subprocess.run(cppcheck_command.split(), capture_output=True, text=True)
 
    # 在这里添加自定义规则
    def custom_filter(error):
        # 示例规则:过滤所有包含特定文件名的警告
        return "my_special_file.cpp" not in error
 
    filtered_errors = list(filter(custom_filter, result.stderr.splitlines()))
 
    for error in filtered_errors:
        print(error)
 
if __name__ == "__main__":
    main()

这个示例脚本使用 subprocess.run 来运行 CppCheck,并捕获输出。然后,它根据自定义规则(在这里是忽略包含特定文件名的警告)对输出进行过滤。您可以在 custom_filter 函数中编写自己的过滤规则。

3.可以使用--rule和--rule-file选项添加此类规则。 也可以使用正则表达式,例如:

\sget[A-Za-z]+\(\)\s+{\s+return

这取决于代码库。

如果可以编写正则表达式,那么这是创建自定义规则的最直接,最简单的方法。

有关更多信息,请在此处阅读"写作规则"文章:

http://sourceforge.net/projects/cppcheck/files/Articles/

但是也许想编写更复杂的规则,可以使用Cppcheck SymbolDatabase,tokenlist和语法树来搜索此类getter方法。 则不能使用--rule和--rule-file。 然后,有以下选择:

  • 使用--dump并编写自己的自定义脚本,以读取输出数据(xml)。
  • 编写C ++代码并将其编译为Cppcheck。

IDE结合使用说明

QtCreator

执行挡:输入cppcheck执行文件的路径。

参数:--enable=all %{CurrentProject:Path}

工作目录:%{CurrentProject:Path}

其他都是默认的。注意,这个是全开的参数,具体参数可参考cppcheck的参数说明,都一样的。

使用:菜单 – 工具 – 外部 – cppcheck,就可以。Linux版也是一样的。

Windows VS

Cppcheck是一个用于C/C++代码的静态分析工具,它可以帮助开发者检测代码中的错误。以下是在Visual Studio 2019和2022中安装Cppcheck的步骤:

1. **下载Cppcheck**

  首先,你需要下载Cppcheck。你可以从其官方GitHub页面(https://github.com/danmar/cppcheck)下载最新版本的Cppcheck。

2. **安装Cppcheck**

  下载完成后,运行安装程序并按照提示进行安装。记住你安装Cppcheck的路径,因为你稍后需要在Visual Studio中使用它。

3. **下载和安装Visual Studio插件**

  接下来,你需要下载并安装Cppcheck的Visual Studio插件。你可以从Visual Studio Marketplace(https://marketplace.visualstudio.com/items?itemName=MatthewManela.CppcheckforVisualStudio)下载插件。

  在Visual Studio中,点击"Extensions"(扩展)菜单,然后选择"Manage Extensions"(管理扩展)。在打开的窗口中,点击"Online"(在线),然后在搜索框中输入"Cppcheck"。找到"Cppcheck for Visual Studio",点击"Download"(下载)。

  下载完成后,重启Visual Studio以完成插件的安装。

4. **配置Cppcheck**

  插件安装完成后,你需要配置Cppcheck。在Visual Studio中,点击"Tools"(工具)菜单,然后选择"Options"(选项)。在打开的窗口中,找到"Cppcheck",然后在"Cppcheck path"(Cppcheck路径)中输入你之前安装Cppcheck的路径。

5. **使用Cppcheck**

  现在,你可以开始使用Cppcheck了。在Visual Studio中,右键点击你的项目,然后选择"Run Cppcheck"(运行Cppcheck)。Cppcheck将开始分析你的代码,并在"Error List"(错误列表)窗口中显示结果。

检测内存泄漏

首先,让我们创建一段有内存泄露的 C++ 代码。

#include <iostream>
 
int main() {
    int *array = new int[100];
    return 0;
}

在这段代码中,我们在`main()`函数中分配了一段内存,但在函数结束时没有释放。

然后,我们使用 Cppcheck 来检查这段代码。

cppcheck --enable=all memory_leak.cpp

最后,Cppcheck 的输出可能类似下面这样:

Checking memory_leak.cpp...
[Memory_leak.cpp:4]: (error) Memory leak: array

这个输出表示在 `memory_leak.cpp` 的第 4 行中,我们动态分配的内存没有被释放,导致了内存泄露。

目录
相关文章
|
2月前
|
C++
C++ 语言异常处理实战:在编程潮流中坚守稳定,开启代码可靠之旅
【8月更文挑战第22天】C++的异常处理机制是确保程序稳定的关键特性。它允许程序在遇到错误时优雅地响应而非直接崩溃。通过`throw`抛出异常,并用`catch`捕获处理,可使程序控制流跳转至错误处理代码。例如,在进行除法运算或文件读取时,若发生除数为零或文件无法打开等错误,则可通过抛出异常并在调用处捕获来妥善处理这些情况。恰当使用异常处理能显著提升程序的健壮性和维护性。
51 2
|
2月前
|
算法框架/工具 C++ Python
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
111 0
|
6天前
|
C++
继续更新完善:C++ 结构体代码转MASM32代码
继续更新完善:C++ 结构体代码转MASM32代码
|
6天前
|
C++ Windows
HTML+JavaScript构建C++类代码一键转换MASM32代码平台
HTML+JavaScript构建C++类代码一键转换MASM32代码平台
|
6天前
|
C++
2合1,整合C++类(Class)代码转换为MASM32代码的平台
2合1,整合C++类(Class)代码转换为MASM32代码的平台
|
6天前
|
C++
HTML+JavaScript构建一个将C/C++定义的ANSI字符串转换为MASM32定义的DWUniCode字符串的工具
HTML+JavaScript构建一个将C/C++定义的ANSI字符串转换为MASM32定义的DWUniCode字符串的工具
|
6天前
|
前端开发 C++ Windows
C++生成QML代码与QML里面集成QWidget
这篇文章介绍了如何在C++中生成QML代码,以及如何在QML中集成QWidget,包括使用Qt Widgets嵌入到QML界面中的技术示例。
|
2月前
|
程序员 C++ 开发者
C++命名空间揭秘:一招解决全局冲突,让你的代码模块化战斗值飙升!
【8月更文挑战第22天】在C++中,命名空间是解决命名冲突的关键机制,它帮助开发者组织代码并提升可维护性。本文通过一个图形库开发案例,展示了如何利用命名空间避免圆形和矩形类间的命名冲突。通过定义和实现这些类,并在主函数中使用命名空间创建对象及调用方法,我们不仅解决了冲突问题,还提高了代码的模块化程度和组织结构。这为实际项目开发提供了宝贵的参考经验。
48 2
|
2月前
|
C++
拥抱C++面向对象编程,解锁软件开发新境界!从混乱到有序,你的代码也能成为高效能战士!
【8月更文挑战第22天】C++凭借其强大的面向对象编程(OOP)能力,在构建复杂软件系统时不可或缺。OOP通过封装数据和操作这些数据的方法于对象中,提升了代码的模块化、重用性和可扩展性。非OOP方式(过程化编程)下,数据与处理逻辑分离,导致维护困难。而OOP将学生信息及其操作整合到`Student`类中,增强代码的可读性和可维护性。通过示例对比,可以看出OOP使C++代码结构更清晰,特别是在大型项目中,能有效提高开发效率和软件质量。
23 1
|
2月前
|
C++
C++代码来计算一个点围绕另一个点旋转45度后的坐标
C++代码来计算一个点围绕另一个点旋转45度后的坐标
47 0
下一篇
无影云桌面