【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 行中,我们动态分配的内存没有被释放,导致了内存泄露。

目录
相关文章
|
30天前
|
存储 C++
基于C++的简易文件压缩与解压缩工具设计与实现
基于C++的简易文件压缩与解压缩工具设计与实现
16 3
|
30天前
|
自然语言处理 算法 前端开发
C++与Doxygen:精通代码文档化之道
C++与Doxygen:精通代码文档化之道
49 0
|
1月前
|
Linux 编译器 程序员
【Linux 调试秘籍】深入探索 C++:运行时获取堆栈信息和源代码行数的终极指南
【Linux 调试秘籍】深入探索 C++:运行时获取堆栈信息和源代码行数的终极指南
68 0
|
1月前
|
数据可视化 关系型数据库 编译器
【C/C++ 单线程性能分析工具 Gprof】 GNU的C/C++ 性能分析工具 Gprof 使用全面指南
【C/C++ 单线程性能分析工具 Gprof】 GNU的C/C++ 性能分析工具 Gprof 使用全面指南
114 2
|
30天前
|
IDE Linux 开发工具
一网打尽:C++远程调试工具和策略全指南
一网打尽:C++远程调试工具和策略全指南
69 2
|
1月前
|
算法 C++ 开发者
【C++ 20 并发工具 std::barrier】掌握并发编程:深入理解C++的std::barrier
【C++ 20 并发工具 std::barrier】掌握并发编程:深入理解C++的std::barrier
46 0
|
1天前
|
设计模式 编译器 数据安全/隐私保护
C++ 多级继承与多重继承:代码组织与灵活性的平衡
C++的多级和多重继承允许类从多个基类继承,促进代码重用和组织。优点包括代码效率和灵活性,但复杂性、菱形继承问题(导致命名冲突和歧义)以及对基类修改的脆弱性是潜在缺点。建议使用接口继承或组合来避免菱形继承。访问控制规则遵循公有、私有和受保护继承的原则。在使用这些继承形式时,需谨慎权衡优缺点。
12 1
|
3天前
|
设计模式 存储 Java
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
|
3天前
|
C++
【C++】在使用代码组装URL时,一定要注意的坑......
【C++】在使用代码组装URL时,一定要注意的坑......
9 0
|
10天前
|
编译器 C++
C++编程之美:探索初始化之源、静态之恒、友情之桥与匿名之韵
C++编程之美:探索初始化之源、静态之恒、友情之桥与匿名之韵
21 0