首页 > 其他分享 >Cppcheck 静态代码分析

Cppcheck 静态代码分析

时间:2024-11-21 21:18:01浏览次数:3  
标签:静态 代码 -- cppcheck cpp Cppcheck 工具 example

Cppcheck 工具主要用于静态代码分析,帮助开发者在不运行代码的情况下发现潜在的错误、代码质量问题或性能隐患。

Cppcheck 安装

sudo apt install cppcheck

Cppcheck 使用

基本用法

cppcheck [选项] [文件或目录]

常用命令和选项

  1. 检查单个文件
cppcheck example.cpp
  1. 检查整个目录(递归分析)
cppcheck --enable=all path/to/directory
  1. 启用所有检测规则
cppcheck --enable=all example.cpp

默认只执行基本错误检测,加上 --enable=all 会启用性能、代码风格等规则。

  1. 生成详细报告
cppcheck --verbose example.cpp
  1. 输出检查结果到文件
cppcheck example.cpp 2> report.txt

Cppcheck 的结果默认输出到 stderr,用 2> 将其重定向到文件。

检查特定类型的错误

cppcheck --enable=warning,performance example.cpp

常用类型:

  • warning:警告。
  • style:代码风格问题。
  • performance:性能问题。
  • portability:跨平台兼容问题。
  • unusedFunction:未使用的函数。
  1. 忽略某些文件或目录
cppcheck --exclude=path/to/ignore example.cpp
  1. 指定语言标准
cppcheck --std=c++17 example.cpp

支持的标准有:c89, c99, c11, c++03, c++11, c++14, c++17, c++20

  1. 多线程分析
cppcheck --jobs=4 example.cpp

--jobs=N 指定使用 N 个线程并行分析,提高速度。

  1. 生成 XML 报告
cppcheck --xml --xml-version=2 example.cpp 2> report.xml

XML 格式的输出通常用于与其他工具集成(如 CI/CD 流程)。

  1. 忽略特定警告
cppcheck --suppress=警告类型 example.cpp

示例:

cppcheck --suppress=unusedFunction example.cpp

显示 Cppcheck 支持的所有选项

cppcheck --help 

示例命令

建议使用 man 手册查看具体的使用命令

  1. 分析一个项目并启用所有规则
cppcheck --enable=all --std=c++17 --output-file=report.txt src/
  1. 检查特定文件,并忽略未使用的函数
cppcheck --enable=all --suppress=unusedFunction main.cpp
  1. 与编译器数据库配合使用(配合 compile_commands.json
cppcheck --project=compile_commands.json

其他静态分析工具

通用静态分析工具

  1. Clang-Tidy
    1. 基于 LLVM 的工具,适用于 C/C++。
    2. 提供代码质量检查、现代化建议(如将代码迁移到 C++11/14/17)、性能优化建议等。
    3. 与 Cppcheck 类似,但更侧重于代码风格和语言标准。
  2. PVS-Studio
    1. 商业工具,支持 C/C++、C# 和 Java。
    2. 功能强大,可以发现多种类型的潜在问题,例如未定义行为、内存泄漏、并发错误等。
    3. 提供集成到 IDE(如 Visual Studio)的支持。
  3. SonarQube
    1. 支持多种编程语言,包括 C/C++。
    2. 侧重于代码质量和安全性分析,提供丰富的报告和团队协作功能。
    3. 适合与持续集成工具(如 Jenkins)结合使用。
  4. Coverity
    1. 商业级静态分析工具,支持 C/C++ 和其他语言。
    2. 可以发现复杂的代码缺陷,例如资源泄漏、死锁等。
    3. 通常用于大型项目。
  5. Flawfinder
    1. 主要关注 C/C++ 安全问题。
    2. 可以快速扫描代码,查找与安全相关的缺陷。

专注于特定方面的工具

  1. Infer
    1. 开源工具,由 Facebook 开发。
    2. 擅长检测内存泄漏、空指针引用、资源泄漏等问题。
    3. 支持多语言,包括 C/C++。
  2. OCLint
    1. 专注于代码复杂性和风格检查。
    2. 适合发现冗长代码、重复代码和不必要的依赖。
  3. Sparse
    1. 由 Linux 内核开发者设计,专注于 C 语言。
    2. 特别适用于检查 Linux 内核代码中的问题。
  4. Coccinelle
    1. 用于 C 代码的源码匹配和转换工具。
    2. 可以进行复杂的代码模式匹配,适合代码重构。
  5. Splint
    1. 专注于静态分析 C 代码。
    2. 提供丰富的规则,但配置复杂且不再活跃维护。

代码质量检查与格式化工具

  1. Lint 系列工具(如 cpplint)
    1. 提供简单的代码风格检查。
    2. 较轻量,适合用于代码格式规范化。
  2. AST-based Tools
    1. 如 Clang Static Analyzer 和基于 AST 的工具,可以深入分析代码逻辑。

标签:静态,代码,--,cppcheck,cpp,Cppcheck,工具,example
From: https://blog.csdn.net/weixin_46588705/article/details/143955213

相关文章

  • YOLOv8-ultralytics-8.2.103部分代码阅读笔记-block.py
    block.pyultralytics\nn\modules\block.py目录block.py1.所需的库和模块2.classDFL(nn.Module):3.classProto(nn.Module):4.classHGStem(nn.Module): 5.classHGBlock(nn.Module): 6.classSPP(nn.Module): 7.classSPPF(nn.Module): 8.classC1(nn.Module):......
  • 多目标优化算法:多目标伞蜥优化算法Multi-objective Frilled Lizard Optimization求解D
    一、伞蜥优化算法伞蜥优化算法(FrilledLizardOptimization,FLO)是2024年提出的一种新颖的元启发式算法,它模仿了伞蜥在其自然栖息地中独特的狩猎行为。该算法的核心原则被详细地描述并数学结构化为两个不同的阶段:(i)探索阶段,模仿蜥蜴对猎物的突然攻击;(ii)开发阶段,模拟蜥......
  • 程序员的第一个代码“Hello,World!“
    Hello,World!随便新建一个文件夹,存放将要用到的代码新建一个后缀名为.java的文件Hello.java编写代码publicclassHello{ publicstaticvoidmain(String[]args){ System.out.print("Hello,World!"); }}编译打开cmd到存放刚写代码的目录cmd输入jav......
  • 【华为】配置VXLAN构建虚拟网络实现相同网段互通(静态方式)
    微思网络厦门微思网络组网需求企业已经建成比较成熟的园区网络,但是没有专用的数据中心网络,所有的服务器分布在不同的部门,并且不具备集中放置的条件。现在用户希望在已有园区网络上构建一个虚拟网络,需求如下:将散落在不同部门的服务器构建成一个虚拟网络,实现资源整合和......
  • 代码随想录算法训练营day52 day53| 卡码网101.孤岛的总面积 102.沉没孤岛 103.水
    学习资料:https://www.programmercarl.com/kamacoder/0101.孤岛的总面积.html#思路邻接矩阵是否被遍历过;每个坐标点上的值为0、1、2等等;四个边的考虑;地图的遍历次数都是卡码网的题学习记录:101.孤岛的总面积点击查看代码#用深搜,遍历邻接矩阵的四个边,先遍历所有可遍历的岛屿,......
  • 阶乘之和 C++实现代码
    #include<bits/stdc++.h>usingnamespacestd;intmain(){ //求和的变量设置为0,阶乘的变量设置为1 longlongintsum1=0,temp_sum=1; intn; cin>>n; for(inti=1;i<=n;i++){ //每次开始不同数字的阶乘需要将值进行重置 temp_sum=1;......
  • C++:AVL树-模拟实现完整代码
    文章目录AVL树-模拟实现完整代码总结:查找错误的方式总结AVL树-模拟实现完整代码总结:#pragmaonce#include<iostream>usingnamespacestd;#include<assert.h>template<classK,classV>structAVLTreeNode{ pair<K,V>_kv;//数据的存储 AVLTreeNod......
  • WEB攻防-XSS跨站&反射型&存储型&DOM型&标签闭合&输入输出&JS代码解析
    XSS跨站-输入输出-原理&分类&闭合漏洞原理:接受输入数据(如前端JS代码进行执行),输出显示数据后解析执行(先分析,在输入,有闭合绕闭合,有过滤绕过滤)反射(非持续型攻击)有一些浏览器会阻止不确定用户会不会点击利用:可以制造一个钓鱼网站基础类型:反射(非持续),存储(持续),DOM......
  • JAVA 静态代理 & 动态代理
    Java中,代理模式是一种常见的设计模式,用于为某对象提供一种代理,以控制对该对象的访问。根据代理类的实现方式,可以分为静态代理和动态代理。以下将分别介绍这两种方式,并进行对比分析。静态代理静态代理是指在编译时期就已经确定了代理类的实现。代理类需要实现与目标对象相同的接......
  • 新手使用代理ip介入代码怎么写?
    Python语言(使用requests库为例)在上述代码中:首先导入了requests库,它是Python中常用的用于发送HTTP请求的库。然后定义了一个字典格式的proxy变量,用于配置代理IP的相关信息,分别针对http和https协议指定代理的地址和端口(这里的http://和https://要按照你获取的代理的实际协议情......