代码静态测试工具之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,一经查实,立即删除!

相关文章

C#密封类和密封成员

密封类和密封成员需要使用 sealed 修饰符,他可以防止当前类被继承或者防止派生类在继承的过程中重写某个方法。 与abstract抽象修饰符类似,sealed 修饰符不仅可用来修饰class,同样也可以修饰类成员。如果sealed关键词用在class上&#xff0c…

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返回的识别结果是按图片上的文字换行而换行,而不…

算法通关村第十一关|白银|位运算高频算法题【持续更新】

1.位移 1.1 位1的个数 原题:力扣191. 挨个判断是不是 1 的话需要对整个长度进行遍历,但是采用技巧可以只寻找为 1 的位,然后将其数量记录下来。 public int hammingWeight(int n) {int count 0;while (n ! 0) {n n & (n - 1);count…

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

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

web3资讯及远程工作

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

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

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

git 简单入门

git init touch test.txt git add test.txt git commit -m 初始化 仓库 git log //查找日志 git checkout -b dev //创建并切换dev分支 git branch // 查找分支 此时有master 和 dev分支, 此时在dev分支 dev分支也有test.txt文件 vim test.txt //写入dev …

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

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

LeetCode617. Merge Two Binary Trees

文章目录 一、题目二、题解 一、题目 You are given two binary trees root1 and root2. Imagine that when you put one of them to cover the other, some nodes of the two trees are overlapped while the others are not. You need to merge the two trees into a new 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…

PHP调用调用API接口的方法及实现

随着互联网、云计算和大数据时代的到来,越来越多的应用程序需要调用第三方的API接口来获取数据,实现数据互通和协同工作。PHP作为一种常用的服务器端语言,也可以通过调用API接口来实现不同系统的数据交互和整合。本文将介绍PHP调用电商API接口…

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 ,我们本篇重点看下…

MacOS设置JAVA_HOME环境变量

首先先查看一下,系统当前使用的java是谁,可以使用/usr/libexec/java_home命令 % /usr/libexec/java_home /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home检查一下这个路径下的文件,发现这是一个jre的目录。加上-V参数看…

Redis篇---第二篇

系列文章目录 文章目录 系列文章目录一、为什么 使用 Redis 而不是用 Memcache 呢?二、为什么 Redis 单线程模型效率也能那么高?三、说说 Redis 的线程模型一、为什么 使用 Redis 而不是用 Memcache 呢? 这时候肯定想到的就是做一个 Memcache 与 Redis 区别。 Redis 和 Mem…

移动机器人路径规划(二)--- 图搜索基础,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如何在娱乐与启发之间取得平衡,以促进心灵成长和积极影响。 娱…