cppcheck新手指引

news2024/11/19 2:26:11

文章目录

    • 一、简介
      • 功能
      • 原理
      • 特征
    • 二、安装
      • Windows
      • Linux
    • 三、使用
      • 1、Manual
      • 2、Windows gui
      • 3、Windows Cli、Linux
      • 4、vscode
      • 5、严重等级
      • 6、常用示例
      • 7、Suppressions
      • 8、html报告
    • 四、用户是否可以编写检查规则?
    • 五、Cppcheck Premium

一、简介

cppcheck 是一个开源的静态代码分析工具,用于检查 C 和 C++ 代码中的潜在问题和错误。
官网:Cppcheck - A tool for static C/C++ code analysis

功能

  • 静态代码分析cppcheck 可以在不编译代码的情况下进行静态代码分析,通过解析源代码来检测问题。

  • 错误检测:它可以检测到常见的编程错误,如空指针解引用、内存泄漏、未初始化的变量、数组越界访问等。

  • 代码规范检查:cppcheck 可以检查代码是否符合特定的编码规范,如命名约定、代码风格等。

  • 性能优化建议:它可以提供一些性能优化的建议,如减少不必要的计算、减少内存分配等。

  • 跨平台支持:cppcheck 可以在多个操作系统上运行,并支持多种编译器。

原理

  • 语法解析:cppcheck 使用自定义的 C/C++ 解析器解析源代码,能够理解C和C++语言的语法和结构,构建抽象语法树(AST)。它是一个独立的工具,可以直接运行并分析C和C++代码。

  • 数据流分析:通过数据流分析来跟踪变量和表达式的值,以检测潜在的错误和问题。数据流分析是一种静态分析技术,它模拟代码的执行路径并跟踪变量的值在程序中的传递方式。 数据流分析在cppcheck中是一项核心技术,它帮助开发人员发现代码中的潜在问题,提高代码的质量和可靠性。cppcheck的数据流分析引擎经过优化,可以有效地处理大型代码库,并提供准确的分析结果。

  • 检查规则:cppcheck 使用一系列检查规则来检测代码中的问题。这些规则可以根据需要进行配置和自定义。

  • 报告生成:分析完成后,cppcheck 会生成报告,其中包含检测到的问题、建议的修复和其他相关信息。

特征

  • 快速:cppcheck 的分析速度相对较快,它不依赖编译。

  • 可定制性:允许用户根据需要选择检查规则和调整分析行为。

  • 跨平台:cppcheck 支持多个操作系统,包括 Windows、Linux 和 macOS。


二、安装

Windows

安装包:https://github.com/danmar/cppcheck/releases/download/2.12.0/cppcheck-2.12.0-x64-Setup.msi

安装界面:

在这里插入图片描述

在这里插入图片描述

安装完成后,需要将cppcheck安装目录添加到环境变量中:

在这里插入图片描述

安装检查:

在这里插入图片描述

vscode中可以安装插件直接使用cppcheck:

在这里插入图片描述

Linux

Source Code:https://github.com/danmar/cppcheck/archive/2.12.0.tar.gz

# 先读readme,安装可选cmake、qmake、clang...
tar xvzf cppcheck-2.9.tar.gz
cd cppcheck-2.9
mkdir build
cd build
cmake ..
cmake -build .
make install

cmake --version


三、使用

1、Manual

http://cppcheck.net/manual.pdf

2、Windows gui

打开cppcheck,点击文件——>打开项目文件,将后缀限制取消,选择需要检测的cpp文件:

在这里插入图片描述

检测结果:

在这里插入图片描述

3、Windows Cli、Linux

在这里插入图片描述

4、vscode

在这里插入图片描述

5、严重等级

cppcheck 检查出的问题可以被分为以下几个严重等级:

  • error:表示代码中存在严重的错误,必须修复才能使代码正常工作。
  • warning:表示代码中存在潜在的问题,可能会导致程序出现错误或异常行为。
  • style:表示代码中存在一些不规范的写法或风格,不影响程序的正确性,但可能会降低代码的可读性和可维护性。
  • performance:表示代码中存在一些性能问题,可能会导致程序运行缓慢或消耗过多的资源。
  • portability:表示代码中存在一些与平台相关的问题,可能会导致程序在不同的操作系统或编译器上出现不同的行为。
  • information:表示代码中存在一些有用的信息,例如未使用的变量或函数等。

6、常用示例

# 1. 检查指定文件:
cppcheck myfile.cpp
# 2. 检查指定目录下的所有文件:
cppcheck mydirectory/
# 3. 显示所有警告:
cppcheck --enable=all myfile.cpp
# 4. 显示特定类型的警告(例如错误和性能问题):
cppcheck --enable=error,performance myfile.cpp
# 5. 输出结果到文件:
cppcheck --output-file=result.txt myfile.cpp
# 6. 忽略特定的警告:
cppcheck --suppress=unusedFunction myfile.cpp
# 7. 检查C++11标准的代码:
cppcheck --std=c++11 myfile.cpp

7、Suppressions

忽略特定警告或者错误。

--suppress=<spec>    Suppress warnings that match <spec>. 
					 The format of <spec> is:
                         [error id]:[filename]:[line]
                         The [filename] and [line] are optional. If [error id]
                         is a wildcard '*', all error ids match.
                         
# 查看所有的error id
cppcheck --errorlist

<error id="memleak" severity="error" msg="Memory leak: varname" verbose="Memory leak: varname" cwe="401">
	<symbol>varname</symbol>
</error>
# 通用弱点枚举(Common Weakness Enumeration,CWE),CWE是一种用于标识和分类常见软件安全弱点和漏洞的标准化列表。 

# 常见的error id
# uninitvar :未初始化的变量 
# arrayIndexOutOfBounds :数组越界访问 
# nullPointer :空指针引用 
# invalidFunctionPointer :无效的函数指针 
# memoryLeak :内存泄漏 
# unusedFunction :未使用的函数 
# redundantAssignment :多余的赋值操作 
# uninitMemberVar :未初始化的类成员变量 
# uninitStructMember :未初始化的结构体成员 
# invalidIterator :无效的迭代器使用 
# resourceLeak :资源泄漏

# 忽略未初始化的变量警告
cppcheck --suppress=uninitvar myfile.cpp


# 可以通过--enable参数来启用或禁用检查器列表
--enable=<id>        Enable additional checks. The available ids are:
                          * all
                                  Enable all checks. It is recommended to only
                                  use --enable=all when the whole program is
                                  scanned, because this enables unusedFunction.
                          * warning
                                  Enable warning messages
                          * style
                                  Enable all coding style checks. All messages
                                  with the severities 'style', 'warning',
                                  'performance' and 'portability' are enabled.
                          * performance
                                  Enable performance messages
                          * portability
                                  Enable portability messages
                          * information
                                  Enable information messages
                          * unusedFunction
                                  Check for unused functions. It is recommended
                                  to only enable this when the whole program is
                                  scanned.
                          * missingInclude
                                  Warn if there are missing includes.
                         Several ids can be given if you separate them with
                         commas. See also --std

8、html报告

Linux cppcheck安装目录中的htmlreport/cppcheck-htmlreport是一个python脚本,能够生成html报告,但是依赖pygments包。

[root@kl127] htmlreport/cppcheck-htmlreport -h
The output screen says:
Usage: cppcheck-htmlreport [options]

Options:
-h, --help show this help message and exit
--file=FILE The cppcheck xml output file to read defects from.
Default is reading from stdin.
--report-dir=REPORT_DIR
The directory where the html report content is written.
--source-dir=SOURCE_DIR
Base directory where source code files can be found.

Example usage:
./cppcheck gui/test.cpp --xml 2> err.xml
htmlreport/cppcheck-htmlreport --file=err.xml --report-dir=test1 --source-dir=.


四、用户是否可以编写检查规则?

可以。
cppcheck的配置文件(.cfg文件)允许用户定义自定义的检查规则和配置选项。用户可以使用正则表达式和其他匹配模式来定义自己的规则,并指定需要检查的代码模式或特定的代码结构。 用户可以在配置文件中指定自定义规则的名称、匹配模式和相关的警告信息。通过在配置文件中添加自定义规则,用户可以根据项目的特定需求添加额外的检查和规则。

官方参考文档:Cppcheck .cfg format (sourceforge.io)

示例:

#include <stdio.h>

void Nothing(void *arg1, void *arg2)
{
    printf("Do nothing\n");
}


int main() {
    Nothing(NULL, NULL);

    printf("hello world\n");
    return 0;
}
<!--custom.cfg-->
<?xml version="1.0"?>
    <def>
    <function name="Nothing">
        <arg nr="1">
            <not-null/>
        </arg>
        <arg nr="2"/>
    </function >
</def>

在上面的示例中,我们定义了一个规则。检测调用Nothing函数的第一个参数是否为空,如果为空,就出错。

在这里插入图片描述

同时,cppckech gui中也能编辑.cfg文件,查看——>库编辑器——>打开——>编辑:

在这里插入图片描述


五、Cppcheck Premium

Cppcheck的付费版本,可提供以下一些增强功能:

  1. 提供更多的检查规则。

  2. 提供更多的定制选项,允许用户根据自己的需求和项目要求进行更精细的配置。

  3. 具有更高级的性能优化,可以更快速地分析大型代码库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1109740.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue中echart-gl 3D地图纹理实例

1. 安装 npm install echarts npm install echarts-gl2. vue组件 html部分 <template><section class"chartapp"><div class"map-chart" ref"mapChart"></div></section> </template>JS引入 import * as…

MIPS64乘法器模拟实验

目录 忽略溢出的乘法器 溢出提示的乘法器 忽略溢出的乘法器 首先&#xff0c;我们得了解乘法器如何由加法器设计得到&#xff0c;此处&#xff0c;我们以32位乘法为例。 总共分为4步&#xff1a; 1. 测试乘数最低位是否为1&#xff0c;是则给乘积加上被乘数&#xff0…

Linux-Jconsole连接远程服务器

Jconsole连接远程服务器 一、修改jmxremote.password.template文件二、启动jar项目三、jconsole远程连接1、打开的你jconsole2、远程连接 一、修改jmxremote.password.template文件 进去你的/idk/jre/lib/management目录下可以看到jmxremote.password.template文件 修改jmxr…

“智能+”时代,深维智信如何借助阿里云打造AI内容生成系统

云布道师 前言&#xff1a; 随着数字经济的发展&#xff0c;线上数字化远程销售模式越来越成为一种主流&#xff0c;销售流程也演变为线上视频会议、线下拜访等多种方式的结合。根据 Gartner 报告&#xff0c;到 2025 年 60% 的 B2B 销售组织将从基于经验和直觉的销售转变为数…

lazada店铺商品评论数据采集,lazada商品评论数据接口,lazadaAPI接口

lazada店铺商品评论数据可以通过以下步骤进行采集&#xff1a; 注册Lazada开发者账号。首先在Lazada开放平台网站上注册并创建开发者账号&#xff0c;并创建一个应用&#xff0c;获取到所需的App Key和App Secret等信息。设置API密钥和访问令牌。使用获取到的App Key和App Sec…

(python)系统路径和文件操作 —— os和pathlib

文章目录 前言1、遍历目录下的文件 前言 pathlib 和 os 是 Python 中用于处理文件路径和文件系统操作的两个模块。os 模块提供了底层的操作系统相关功能&#xff1b;pathlib 提供了面向对象的路径操作接口。pathlib 模块实际上是在 os 模块的基础上进行了封装和扩展&#xff0…

2023年中国车载导航仪产量、销量及市场规模分析[图]

车载导航仪是一种用于汽车上的电子设备&#xff0c;用于帮助驾驶员找到目的地并规划路线&#xff0c;它通常使用地图软件和GPS定位技术来确定车辆的位置&#xff0c;并提供语音和图形指示&#xff0c;以指导驾驶员前往目的地。 车载导航仪行业分类 资料来源&#xff1a;共研产…

又一个新指标可以写,氧化平衡评分,源自膳食以及生活方式

郑老师统计课程&#xff0c;欢迎点击报名&#xff1a;Nhanes公共数据库挖掘 课程 最近学习文献&#xff0c;发现新指标的使用在越来越NHANES数据库类的文章上占比越来越高。以往的研究证明饮食与生活方式与睡眠质量存在关联&#xff0c;本期我们要学习的文章推出了一个新指标&a…

使用免费SSL证书的好处

在互联网上保护用户隐私和数据安全是至关重要的。SSL证书是一种常见的安全解决方案&#xff0c;用于加密通信并验证网站的真实性。SSL&#xff08;安全套接层&#xff09;证书是一种数字证书&#xff0c;用于建立加密连接&#xff0c;保护数据的机密性和完整性。虽然商业SSL证书…

2023年【氧化工艺】考试报名及氧化工艺考试总结

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 氧化工艺考试报名是安全生产模拟考试一点通总题库中生成的一套氧化工艺考试总结&#xff0c;安全生产模拟考试一点通上氧化工艺作业手机同步练习。2023年【氧化工艺】考试报名及氧化工艺考试总结 1、【单选题】 由和O…

解决ConfigurationBuilder未包含“SetBasePath”的定义

在类库文件中使用ConfigurationBuilder读取json文件时提示ConfigurationBuilder未包含“SetBasePath”的定义。 解决方案&#xff1a; 包控制管理器安装这三个包&#xff0c;缺一不可 Microsoft.Extensions.Configuration Microsoft.Extensions.Configuration.FileExtensions…

FXL6408UMX一款完全可配置的8位12C控制GPIO扩展器

FXL6408UMX是一款8位I 2 C受控的GPIO扩展器。当配置为输入模式时&#xff0c;FXL6408监控用于数据转换的输入端口&#xff0c;并通过指定/ INT引脚的所有输入可配置上拉或下拉电阻&#xff0c;在漏极开路或非驱动应用场景预偏置输入。当配置为输出模式时&#xff0c; GPIO引脚根…

四元数数学性质、运算规则、线性插值(公式版)

四元数 Q ⟨ x , y , z , w ⟩ Q \langle x, y, z, w \rangle Q⟨x,y,z,w⟩ Q x i y j z k w Q xi yj zk w Qxiyjzkw 1.运算与性质 1)数乘 Q s ⋅ ⟨ x , y , z , w ⟩ ⟨ s ⋅ z , s ⋅ y , s ⋅ z , s ⋅ w ⟩ Q s \cdot \langle x, y, z, w \rangle \langle…

java击球小游戏运行代码

创建一个图形化的小游戏通常需要使用Java图形库&#xff0c;例如Swing或JavaFX。下面是一个使用JavaFX创建的简单的图形化小游戏示例&#xff0c;其中一个小球会在窗口内移动&#xff0c;你需要点击小球以增加得分&#xff1a; import javafx.application.Application; import…

淘宝开放平台 API 获取淘宝天猫店铺订单接口

业务场景&#xff1a;作为全球最大的 B2C 电子商务平台之一&#xff0c;淘宝&#xff08;天猫&#xff09;平台提供了丰富的商品资源&#xff0c;吸引了大量的全球买家和卖家。为了方便开发者接入淘宝平台&#xff0c;淘宝平台提供了丰富的 API 接口&#xff0c;其中商品详情接…

2023年【北京市安全员-A证】试题及解析及北京市安全员-A证证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 北京市安全员-A证试题及解析是安全生产模拟考试一点通总题库中生成的一套北京市安全员-A证证考试&#xff0c;安全生产模拟考试一点通上北京市安全员-A证作业手机同步练习。2023年【北京市安全员-A证】试题及解析及北…

【大数据开发技术】实验06-SequenceFile、元数据操作与MapReduce单词计数

文章目录 SequenceFile、元数据操作与MapReduce单词计数一、实验目标二、实验要求三、实验内容四、实验步骤附&#xff1a;系列文章 SequenceFile、元数据操作与MapReduce单词计数 一、实验目标 熟练掌握hadoop操作指令及HDFS命令行接口掌握HDFS SequenceFile读写操作掌握Map…

Redis:用BitMap实现用户签到

BitMap 我们针对签到功能完全可以通过mysql来完成&#xff0c;比如说以下这张表 用户一次签到&#xff0c;就是一条记录&#xff0c;假如有1000万用户&#xff0c;平均每人每年签到次数为10次&#xff0c;则这张表一年的数据量为 1亿条 每签到一次需要使用&#xff08;8 8…

某全球领先的芯片供应商:优化数据跨网交换流程,提高安全管控能力

1、客户介绍 某全球领先的芯片供应商&#xff0c;成立于2005年&#xff0c;总部设于北京&#xff0c;在国内上海、深圳、合肥等地及国外多个国家和地区均设有分支机构和办事处&#xff0c;致力于为客户提供更优质、便捷的服务。 2、建设背景 该公司基于网络安全管理的需求&am…

Qt中纯C++项目发布为dll的方法(超详细步骤)

目录 一般创建方法导出普通函数的方法&调用方法导出类及其成员函数的方法&调用方法 众所周知&#xff0c;我们可以将C项目中的类以及函数导出&#xff0c;形成 .dll 文件&#xff0c;以供其他程序使用&#xff0c;下面将说明Qt环境下的使用方法。 首先创建共享库&am…