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

目录
相关文章
|
7天前
|
算法 开发工具 计算机视觉
【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示
【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示
16 1
|
15天前
|
Java Linux C++
性能工具之 C/C++ 分析工具 valgrind
【5月更文挑战第26天】性能工具之 C/C++ 分析工具 valgrind
21 2
性能工具之 C/C++ 分析工具 valgrind
|
15天前
|
C++
C++代码的可读性与可维护性:技术探讨与实践
C++代码的可读性与可维护性:技术探讨与实践
18 1
|
2天前
|
C++
c++primer plus 6 读书笔记 第十四章 C++中的代码重用
c++primer plus 6 读书笔记 第十四章 C++中的代码重用
|
3天前
|
存储 API C语言
C/C++爱心代码
C/C++爱心代码
18 2
|
8天前
|
存储 人工智能 C++
【PTA】L1-064 估值一亿的AI核心代码(详C++)
【PTA】L1-064 估值一亿的AI核心代码(详C++)
9 1
|
17天前
|
存储 C语言 Python
从C语言到C++_24(二叉搜索树)概念+完整代码实现+笔试题(下)
从C语言到C++_24(二叉搜索树)概念+完整代码实现+笔试题
36 3
|
17天前
|
C语言
从C语言到C++_24(二叉搜索树)概念+完整代码实现+笔试题(中)
从C语言到C++_24(二叉搜索树)概念+完整代码实现+笔试题
16 1
|
17天前
|
算法 测试技术 C语言
从C语言到C++_24(二叉搜索树)概念+完整代码实现+笔试题(上)
从C语言到C++_24(二叉搜索树)概念+完整代码实现+笔试题
20 0
|
21天前
|
安全 算法 程序员
探索C++的魅力:语言特性、编程实践及代码示例
C++是广泛应用的编程语言,尤其在系统级编程、应用开发、游戏和嵌入式系统中广泛使用。其主要特性包括:面向对象编程(封装、继承、多态),泛型编程(通过模板实现代码复用和类型安全),以及丰富的标准库和第三方库。在编程实践中,需注意内存管理、异常处理和性能优化。示例代码展示了面向对象和泛型编程,如类的继承和泛型函数的使用。C++的内存管理和库支持使其在解决复杂问题时具有高效和灵活性。