代码静态测试工具之cppcheck

cppcheck简介

Cppcheck is an analysis tool for C/C++ code. It provides unique code analysis
to detect bugs and focuses on detecting undefined behaviour and dangerous
coding constructs. The goal is to detect only real errors in the code, and generate
as few false positives (wrongly reported warnings) as possible. Cppcheck is
designed to analyze your C/C++ code even if it has non-standard syntax, as is
common in for example embedded projects.
Supported code and platforms:
• Cppcheck checks non-standard code that contains various compiler extensions,
inline assembly code, etc.
• Cppcheck should be compilable by any compiler that supports C++11 or
later.
• Cppcheck is cross platform and is used in various posix/windows/etc
environments.
The checks in Cppcheck are not perfect. There are bugs that should be found,
that Cppcheck fails to detect.
代码静态测试工具极其丰富,这里不做赘述,仅对开源工具cppcheck的命令行搭建做记录。

cppcheck安装

上官网https://cppcheck.sourceforge.io/选择所需的版本安装
在这里插入图片描述
我这里下载的是2.9版本,下载速度若很慢,可选择镜像地址安装
在这里插入图片描述
安装过程中记得勾选addon选项,否则在安装路径下不会产生addons文件夹,若在命令行执行–addon指令则会报错。ps:cppcheck会通过python misra.py去解析misra规则,从而在生成的结果中,将警告或错误和misra规则关联起来,故电脑需要安装python。

在安装完cppcheck之后,最好将添加安装路径到环境变量,方便命令行的调用。

  • cppcheck
    打开命令行,键入cppcheck,会出现以下信息,说明环境变量设置成功
    在这里插入图片描述
    cppcheck关键词后面添加想要测试的文件路径,则会执行静态测试,并在命令行打印出结果 如:

    cppcheck C:\Users\Desktop\file1.c
    
  • –cppcheck-build-dir
    该指令用作设置cppcheck的路径,就是新建一个文件夹以保存测试过程中产生的数据,这样做有个优点就是,当你执行一次测试之后,产生了比如800个警告或错误,在你修改完一部分之后,重新进行测试的时候,cppcheck只会重新测试有修改点的文件,不会重新拉起全部测试。而不过没有这个指令,每次都会从头执行,若测试文件特别多,这样会很浪费时间。

  • –std=c99
    该指令用来设定语言标准是C99还是其他标准

  • –xml
    用来指示测试完成生成结果是xml格式

  • -i
    在测试中,有一些路径下的文件无需测试,比如MBD生成的文件已经满足misra的标准,那么通过-i 加文件路径的格式就可以达到这个目的,这个文件夹下的所有文件将不会被测试。当有多个路径需要被关闭时,每个路径都需要有独立的-i 如:-i “path a” -i “path b”

  • –addon
    如上所述,这里会添加一个json文件,这个json文件中指定python的文件,及misra的规则文件如:

 {
"script": "misra.py",
"args": [
"--rule-texts=./addons/misra2012_rules_dummy_ascii.txt"
] }

这里的misra.py和misra2012_rules_dummy_ascii.txt在cppcheck的官网都可以找到

  • –suppressions-list
    在测试过程中,有些警告是可以接受或者无法避免的或者不适用,就需要压制这些警告,具体做法是
    在这里插入图片描述
    可以利用–suppress指令单独声明,也可以按照上图的做法,将所有需要压制的ID写在一个txt文本中,作为一个list整体压制,当然是推荐后者。另外压制可以选择统一压制,也可以选择压制某个文件的某个ID,具体做法就是在ID后面跟文件的路径即可,也可以指定哪一行来压制。
  • misra2012_rules_dummy_ascii.txt
    可以在cppcheck路径下找到demo,本质是从misra官网下载规范,然后将Appendix A Summary of guidelines章节的规则号,描述等信息按照demo来填写形成一个txt文本。
    最后
    最后提供一个范例,直接复制在命令行执行,生成结果。移植到别的项目只需要切换路径即可。
cppcheck 
--cppcheck-build-dir="C:\cppcheck_demo\Cppcheck_build_folder" 
--std=c99 
--xml 
-i"C:\cppcheck_demo\Src\folderA" 
-i"C:\cppcheck_demo\Src\folderB" 
--addon="C:\cppcheck_demo\misra.json" 
--suppressions-list="C:\cppcheck_demo\suppress.txt" 
"C:\cppcheck_demo\Src" 2> "C:\cppcheck_demo\error.xml

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

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

相关文章

AIGC实战——变分自编码器(Variational Autoencoder, VAE)

AIGC实战——变分自编码器 0. 前言1. 变分自编码器1.1 基本原理1.2 编码器 2. 构建VAE编码器2.1 Sampling 层2.2 编码器2.3 损失函数2.4 训练变分自编码器 3. 变分自编码器分析小结系列链接 0. 前言 我们已经学习了如何实现自编码器,并了解了自编码器无法在潜空间中…

React-Router源码分析-History库

history源码 history 在 v5 之前使用单独的包, v6 之后再 router 包中单独实现。 history源码 Action 路由切换的动作类型,包含三种类型: POPREPLACEPUSH Action 枚举: export enum Action {Pop "POP",Push &quo…

OCR转换技巧:如何避免图片转Word时出现多余的换行?

在将图片中的文字识别转换为Word文档时,我们很多时候时会遇到识别内容的一个自然段还没结束就换行的问题,这些就是我们常说的多余换行的问题。为什么会产生这个问题呢?主要是由于OCR返回的识别结果是按图片上的文字换行而换行,而不…

高并发架构设计(三大利器:缓存、限流和降级)

引言 高并发背景 互联网行业迅速发展,用户量剧增,系统面临巨大的并发请求压力。 软件系统有三个追求:高性能、高并发、高可用,俗称三高。三者既有区别也有联系,门门道道很多,全面讨论需要三天三夜&#…

web3资讯及远程工作

各位如果想了解区块链相关的消息可以通过如下网址了解,里面还会有相关职位招聘(包括远程工作),还可以在里面进行发帖,进入即可获得1000积分,后期可以兑换一些礼品Cryptosquare

如何检查 Docker 和 Kubernetes 是否可以访问外部网络,特别是用于拉取镜像的仓库?

要检查 Docker 和 Kubernetes 是否可以访问外部网络,尤其是用于拉取容器镜像的仓库,您可以按照以下步骤进行: 1. 检查节点的网络连接 首先,您需要确保 Kubernetes 节点能够访问外部网络。这可以通过在节点上执行 ping 命令来测试…

2023 年 数维杯(B题)国际大学生数学建模挑战赛 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2021年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题。 让我们来看看数维杯(B题)! …

一文看懂Spark中Cache和CheckPoint的区别

目录 循循渐进理解使用Cache或者PersistCheckPoint缓存和CheckPoint的区别 循循渐进理解 wc.txt数据 hello java spark hadoop flume kafka hbase kafka flume hadoop看下面代码会打印多少条-------------------------(RDD2) import org.apache.spark.rdd.RDD import org.ap…

Jmeter- Beanshell语法和常用内置对象(网络整理)

在利用jmeter进行接口测试或者性能测试的时候,我们需要处理一些复杂的请求,此时就需要利用beanshell脚本了,BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法,所以它和java是可以无缝衔接的。beans…

RK3588平台开发系列讲解(摄像头篇)USB摄像头驱动分析

🚀返回专栏总目录 文章目录 一. USB摄像头基本知识1.1 内部逻辑结构1.2 描述符实例解析二. UVC驱动框架2.1、设备枚举过程2.2、数据传输过程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 USB摄像头驱动位于 drivers\media\usb\uvc\uvc_driver.c ,我们本篇重点看下…

移动机器人路径规划(二)--- 图搜索基础,Dijkstra,A*,JPS

目录 1 图搜索基础 1.1 机器人规划的配置空间 Configuration Space 1.2 图搜索算法的基本概念 1.3 启发式的搜索算法 Heuristic search 2 A* Dijkstra算法 2.1 Dijkstra算法 2.2 A*&&Weighted A*算法 2.3 A* 算法的工程实践中的应用 3 JPS 1 图搜索基础 1.1…

AD教程 (十六)常用PCB封装的直接调用

AD教程 (十六)常用PCB封装的直接调用 打开已经做好的PCB文件 点击设计,生成PCB库,会自动把PCB里所用到的所有封装,全部自动生成 CtrlA 将所有元器件的封装全部选中(或者只选中所需要的)&#x…

TikTok与心灵成长:娱乐与启发并重

社交媒体已成为我们生活的一部分,其中TikTok以其短视频内容和创新性而闻名。然而,TikTok不仅仅是一个娱乐平台,它还具有潜力成为心灵成长的有力工具。本文将探讨TikTok如何在娱乐与启发之间取得平衡,以促进心灵成长和积极影响。 娱…

IntelliJ IDEA启动一个普通的java web项目的配置

原创/朱季谦 这是我很久以前刚开始用IntelliJ IDEA时记录的笔记,应该是五年前的一篇笔记了。正好赶上最近离职了,可以有比较多的时间把以前的记录整理一下,可以让刚接触到IntelliJ IDEA的童鞋学习如何在IntelliJ IDEA引入一个单机版的jar形式…

蓝桥杯 冒泡排序

冒泡排序的思想 冒泡排序的思想是每次将最大的一下一下移动到最右边,然后将最右边这个确定下来。 再来确定第二大的,再确定第三大的… 对于数组a[n],具体来说,每次确定操作就是从左往右扫描,如果a[i]>a[i1],我们将…

Android问题笔记四十五:解决SeekBar操作thumb周围产生的圆形阴影/灰色阴影/白色圆圈的解决办法

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列点击跳转>ChatGPT和AIGC 👉关于作者 专…

如何在Ubuntu 23.10部署KVM并创建虚拟机?

正文共:1114 字 21 图,预估阅读时间:2 分钟 我们之前对OpenStack醉过一次简单介绍(什么是OpenStack?),OpenStack本身是一个云管理平台,它本身并不提供虚拟化功能,而是依赖…

第二证券:今日投资前瞻:小米汽车引关注 全球风光有望持续高速发展

昨日,两市股指盘中轰动上扬,深成指、创业板指一度涨超1%。到收盘,沪指涨0.55%报3072.83点,深成指涨0.72%报10077.96点,创业板指涨0.53%报2015.36点,北证50指数涨2.64%;两市算计成交9900亿元&…

JVM——类加载器(JDK8及之前,双亲委派机制)

目录 1.类加载器的分类1.实现方式分类1.虚拟机底层实现2.JDK中默认提供或者自定义 2.类加载器的分类-启动类加载器3.类加载器的分类-Java中的默认类加载器4.类加载器的分类-扩展类加载器5.类加载器的分类-类加载器的继承 2.类加载器的双亲委派机制 类加载器(ClassLo…

MySQL库操作

创建一个数据库,本质就是在Linux下创建一个目录。 当要使用一个库时,先 use 数据库名字。 使用数据库,相当于Linux下的cd命令 附:systen clear mysql内无法直接使用clear,但可以使用systen clear(系统调用…