cppcheck静态扫描代码是否符合MISRA-C 2012规范

1 下载安装cppcheck

1.1 下载安装包

下载地址:http://cppcheck.net/
同时把 Source code (.zip) 也下载下来,后面会用到。
在这里插入图片描述

在这里插入图片描述

1.2 安装及配置

双击安装文件,保持默认配置安装即可,默认安装的路径为:C:\Program Files\Cppcheck 。
将步骤一下载的 source code.zip解压,将根目录下的 addons 目录拷贝到安装目录。
在这里插入图片描述
在这里插入图片描述

然后将安装路径添加到系统路径 path 中,方便命令行直接使用命令。
在这里插入图片描述

2 创建配置文件

在存放安装包的目录下(其他路径也可以)创建一个misra.json 的文件,内容如下:

{
  "script": "misra.py",
  "args": [
    "--rule-texts=D:/Software/Package/cppcheck/MISRA_C_2012.txt",
    "--suppress-rules 17.3,21.12"
  ]
}

同时准备一个misra-c 2012的规则文件 MISRA_C_2012.txt :

Appendix A Summary of guidelines
Rule 1.1
The program shall contain no violations of the standard C syntax and constraints and shall not exceed the implementation's translation limits 
Rule 1.2
Language extensions should not be used 
Rule 1.3
There shall be no occurrence of undefined or critical unspecified behaviour 
Rule 2.1
A project shall not contain unreachable code 
Rule 2.2
There shall be no dead code 
Rule 2.3
A project should not contain unused type declarations 
Rule 2.4
A project should not contain unused tag declarations 
Rule 2.5
A project should not contain unused macro declarations 
Rule 2.6
A function should not contain unused label declarations 
Rule 2.7
There should be no unused parameters in functions 
Rule 3.1
The character sequences /* and // shall not be used within a comment 
Rule 3.2
Line-splicing shall not be used in // comments 
Rule 4.1
Octal and hexadecimal escape sequences shall be terminated 
Rule 4.2
Trigraphs should not be used 
Rule 5.1
External identifiers shall be distinct 
Rule 5.2
Identifiers declared in the same scope and name space shall be distinct 
Rule 5.3
An identifier declared in an inner scope shall not hide an identifier declared in an outer scope 
Rule 5.4
Macro identifiers shall be distinct 
Rule 5.5
Identifiers shall be distinct from macro names 
Rule 5.6
A typedef name shall be a unique identifier 
Rule 5.7
A tag name shall be a unique identifier 
Rule 5.8
Identifiers that define objects or functions with external linkage shall be unique 
Rule 5.9
Identifiers that define objects or functions with internal linkage should be unique 
Rule 6.1
Bit-fields shall only be declared with an appropriate type 
Rule 6.2
Single-bit named bit fields shall not be of a signed type 
Rule 7.1
Octal constants shall not be used 
Rule 7.2
A u or U suffix shall be applied to all integer constants that are represented in an unsigned type 
Rule 7.3
The lowercase character l shall not be used in a literal suffix 
Rule 7.4
A string literal shall not be assigned to an object unless the object's type is pointer to const-qualified char 
Rule 8.1
Types shall be explicitly specified 
Rule 8.2
Function types shall be in prototype form with named parameters 
Rule 8.3
All declarations of an object or function shall use the same names and type qualifiers 
Rule 8.4
A compatible declaration shall be visible when an object or function with external linkage is defined 
Rule 8.5
An external object or function shall be declared once in one and only one file 
Rule 8.6
An identifier with external linkage shall have exactly one external definition 
Rule 8.7
Functions and objects should not be defined with external linkage if they are referenced in only one translation unit 
Rule 8.8
The static storage class specifier shall be used in all declarations of objects and functions that have internal linkage 
Rule 8.9
An object should be defined at block scope if its identifier only appears in a single function 
Rule 8.10
An inline function shall be declared with the static storage class 
Rule 8.11
When an array with external linkage is declared its size should be explicitly specified 
Rule 8.12
Within an enumerator list the value of an implicitly-specified enumeration constant shall be unique 
Rule 8.13
A pointer should point to a const-qualified type whenever possible 
Rule 8.14
The restrict type qualifier shall not be used 
Rule 9.1
The value of an object with automatic storage duration shall not be read before it has been set 
Rule 9.2
The initializer for an aggregate or union shall be enclosed in braces 
Rule 9.3
Arrays shall not be partially initialized 
Rule 9.4
An element of an object shall not be initialized more than once 
Rule 9.5
Where designated initializers are used to initialize an array object the size of the array shall be specified explicitly 
Rule 10.1
Operands shall not be of an inappropriate essential type 
Rule 10.2
Expressions of essentially character type shall not be used inappropriately in addition and subtraction operations 
Rule 10.3
The value of an expression shall not be assigned to an object with anarrower essential type or of a different essential type category 
Rule 10.4
Both operands of an operator in which the usual arithmetic conversions are performed shall have the same essential type category 
Rule 10.5
The value of an expression should not be cast to an inappropriate essential type 
Rule 10.6
The value of a composite expression shall not be assigned to an objectwith wider essential type 
Rule 10.7
If a composite expression is used as one operand of an operator in which the usual arithmetic conversions are performed then the other operand shall not have wider essential type 
Rule 10.8
The value of a composite expression shall not be cast to a different essential type category or a wider essential type 
Rule 11.1
Conversions shall not be performed between a pointer to a function and any other type 
Rule 11.2
Conversions shall not be performed between a pointer to an incomplete type and any other type 
Rule 11.3
A cast shall not be performed between a pointer to object type and a pointer to a different object type 
Rule 11.4
A conversion should not be performed between a pointer to object and an integer type 
Rule 11.5
A conversion should not be performed from pointer to void into pointer to object 
Rule 11.6
A cast shall not be performed between pointer to void and an arithmetic type 
Rule 11.7
A cast shall not be performed between pointer to object and a non-integer arithmetic type 
Rule 11.8
A cast shall not remove any const or volatile qualification from the type pointed to by a pointer 
Rule 11.9
The macro NULL shall be the only permitted form of integer null pointer constant 
Rule 12.1
The precedence of operators within expressions should be made explicit 
Rule 12.2
The right hand operand of a shift operator shall lie in the range zero to one less than the width in bits of the essential type of the left hand operand 
Rule 12.3
The comma operator should not be used 
Rule 12.4
Evaluation of constant expressions should not lead to unsigned integer wrap-around 
Rule 13.1
Initializer lists shall not contain persistent side effects 
Rule 13.2
The value of an expression and its persistent side effects shall be the same under all permitted evaluation orders 
Rule 13.3
A full expression containing an increment (++) or decrement (--) operator should have no other potential side effects other than that caused by the increment or decrement operator 
Rule 13.4
The result of an assignment operator should not be used 
Rule 13.5
The right hand operand of a logical && or || operator shall not contain persistent side effects 
Rule 13.6
The operand of the sizeof operator shall not contain any expression which has potential side effects 
Rule 14.1
A loop counter shall not have essentially floating type 
Rule 14.2
A for loop shall be well-formed 
Rule 14.3
Controlling expressions shall not be invariant 
Rule 14.4
The controlling expression of an if statement and the controlling expression of an iteration-statement shall have essentially Boolean type 
Rule 15.1
The goto statement should not be used 
Rule 15.2
The goto statement shall jump to a label declared later in the same function 
Rule 15.3
Any label referenced by a goto statement shall be declared in the same block or in any block enclosing the goto statement 
Rule 15.4
There should be no more than one break or goto statement used to terminate any iteration statement 
Rule 15.5
A function should have a single point of exit at the end 
Rule 15.6
The body of an iteration-statement or a selection-statement shall be a compound-statement 
Rule 15.7
All if ... else if constructs shall be terminated with an else statement 
Rule 16.1
All switch statements shall be well-formed 
Rule 16.2
A switch label shall only be used when the most closely-enclosing compound statement is the body of a switch statement 
Rule 16.3
An unconditional break statement shall terminate every switch-clause 
Rule 16.4
Every switch statement shall have a default label 
Rule 16.5
A default label shall appear as either the first or the last switch label of a switch statement 
Rule 16.6
Every switch statement shall have at least two switch-clauses 
Rule 16.7
A switch-expression shall not have essentially Boolean type 
Rule 17.1
The features of <stdarg.h> shall not be used 
Rule 17.2
Functions shall not call themselves either directly or indirectly 
Rule 17.3
A function shall not be declared implicitly 
Rule 17.4
All exit paths from a function with non-void return type shall have an explicit return statement with an expression 
Rule 17.5
The function argument corresponding to a parameter declared to have an array type shall have an appropriate number of elements 
Rule 17.6
The declaration of an array parameter shall not contain the static keyword between the [ ] 
Rule 17.7
The value returned by a function having non-void return type shall be used 
Rule 17.8
A function parameter should not be modified 
Rule 18.1
A pointer resulting from arithmetic on a pointer operand shall address an element of the same array as that pointer operand 
Rule 18.2
Subtraction between pointers shall only be applied to pointers that address elements of the same array 
Rule 18.3
The relational operators > >= < and <= shall not be applied to objects of pointer type except where they point into the same object 
Rule 18.4
The + - += and -= operators should not be applied to an expression of pointer type 
Rule 18.5
Declarations should contain no more than two levels of pointer nesting 
Rule 18.6
The address of an object with automatic storage shall not be copied to another object that persists after the first object has ceased to exist 
Rule 18.7
Flexible array members shall not be declared 
Rule 18.8
Variable-length array types shall not be used 
Rule 19.1
An object shall not be assigned or copied to an overlapping object 
Rule 19.2
The union keyword should not be used 
Rule 20.1
#include directives should only be preceded by preprocessor directives or comments 
Rule 20.2
The '  or \ characters and the /* or // character sequences shall not occur in a header file name 
Rule 20.3
The #include directive shall be followed by either a <filename> or filename sequence 
Rule 20.4
A macro shall not be defined with the same name as a keyword 
Rule 20.5
#undef should not be used 
Rule 20.6
Tokens that look like a preprocessing directive shall not occur within amacro argument 
Rule 20.7
Expressions resulting from the expansion of macro parameters shall be enclosed in parentheses 
Rule 20.8
The controlling expression of a #if or #elif preprocessing directive shall evaluate to 0 or 1 
Rule 20.9
All identifiers used in the controlling expression of #if or #elif preprocessing directives shall be #define'd before evaluation 
Rule 20.10
The # and ## preprocessor operators should not be used 
Rule 20.11
A macro parameter immediately following a # operator shall not immediately be followed by a ## operator 
Rule 20.12
A macro parameter used as an operand to the # or ## operators which is itself subject to further macro replacement shall only be used as an operand to these operators 
Rule 20.13
A line whose first token is # shall be a valid preprocessing directive 
Rule 20.14
All #else #elif and #endif preprocessor directives shall reside in the same file as the #if #ifdef or #ifndef directive to which they are related 
Rule 21.1
#define and #undef shall not be used on a reserved identifier or reserved macro name 
Rule 21.2
A reserved identifier or macro name shall not be declared 
Rule 21.3
The memory allocation and deallocation functions of <stdlib.h> shall not be used 
Rule 21.4
The standard header file <setjmp.h> shall not be used 
Rule 21.5
The standard header file <signal.h> shall not be used 
Rule 21.6
The Standard Library input/output functions shall not be used 
Rule 21.7
The atof atoi atol and atoll functions of <stdlib.h> shall not be used 
Rule 21.8
The library functions abort exit getenv and system of <stdlib.h> shall not be used 
Rule 21.9
The library functions bsearch and qsort of <stdlib.h> shall not be used 
Rule 21.10
The Standard Library time and date functions shall not be used 
Rule 21.11
The standard header file <tgmath.h> shall not be used 
Rule 21.12
The exception handling features of <fenv.h> should not be used 
Rule 22.1
All resources obtained dynamically by means of Standard Library functions shall be explicitly released 
Rule 22.2
A block of memory shall only be freed if it was allocated by means of a Standard Library function 
Rule 22.3
The same file shall not be open for read and write access at the same time on different streams 
Rule 22.4
There shall be no attempt to write to a stream which has been opened as read-only 
Rule 22.5
A pointer to a FILE object shall not be dereferenced 
Rule 22.6
The value of a pointer to a FILE shall not be used after the associated stream has been closed 

在这里插入图片描述

3 运行cppcheck命令

当前目录下准备一个测试用的.c文件main.c:

#include <stdio.h>

int main(void)
{
    int  buf[5] = {0, 1};
    buf[5] = 9;
    
    return 0;
}

执行命令:
注意: --enable=all 参数不能省略。

cppcheck --enable=all --addon=D:/Software/Package/cppcheck/misra.json main.c

在这里插入图片描述

将扫描结果输出到xml文件中:

 cppcheck --enable=all --addon=D:/Software/Package/cppcheck/misra.json main.c --output-file=test_report.xml --output-format=xml

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Unity3D】UGUI的anchoredPosition锚点坐标

本文直接以实战去理解锚点坐标&#xff0c;围绕着将一个UI移动到另一个UI位置的需求进行说明。 &#xff08;anchoredPosition&#xff09;UI锚点坐标&#xff0c;它是UI物体的中心点坐标&#xff0c;以UI物体锚点为中心的坐标系得来&#xff0c;UI锚点坐标受锚点(Anchors Min…

【Hadoop】大数据权限管理工具Ranger2.1.0编译

目录 ​编辑一、下载 ranger源码并编译 二、报错信息 报错1 报错2 报错3 报错4 一、下载 ranger源码并编译 ranger官网 https://ranger.apache.org/download.html 由于Ranger不提供二进制安装包&#xff0c;故需要maven编译。安装其它依赖&#xff1a; yum install gcc …

C++20导出模块及使用

1.模块声明 .ixx文件为导入模块文件 math_operations.ixx export module math_operations;//模块导出 //导出命名空间 export namespace math_ {//导出命名空间中函数int add(int a, int b);int sub(int a, int b);int mul(int a, int b);int div(int a, int b); } .cppm文件…

使用 mkcert 本地部署启动了 TLS/SSL 加密通讯的 MongoDB 副本集和分片集群

MongoDB 是支持客户端与 MongoDB 服务器之间启用 TLS/SSL 进行加密通讯的, 对于 MongoDB 副本集和分片集群内部的通讯, 也可以开启 TLS/SSL 认证. 本文会使用 mkcert 创建 TLS/SSL 证书, 基于创建的证书, 介绍 MongoDB 副本集、分片集群中启动 TLS/SSL 通讯的方法. 我们将会在…

2、k8s的cni网络插件和基本操作命令

kube-prxoy属于节点组件&#xff0c;网络代理&#xff0c;实现服务的自动发现和负载均衡。 k8s的内部网络模式 1、pod内的容器于容器之间的通信。 2、一个节点上的pod之间的通信&#xff0c;docker0网桥直接通信。 3、不同节点上的pod之间的通信&#xff1a; 通过物理网卡的…

如何在RTACAR中配置IP多播(IP Multicast)

一、什么是IP多播 IP多播&#xff08;IP Multicast&#xff09;是一种允许数据包从单一源地址发送到多个目标地址的技术&#xff0c;是一种高效的数据传输方式。 多播地址是专门用于多播通信的IP地址&#xff0c;范围从 224.0.0.0到239.255.255.255 与单播IP地址不同&#x…

JavaEE架构

一.架构选型 1.VM架构 VM架构通常指的是虚拟机&#xff08;Virtual Machine&#xff09;的架构。虚拟机是一种软件实现的计算机系统&#xff0c;它模拟了物理计算机的功能&#xff0c;允许在单一物理硬件上运行多个操作系统实例。虚拟机架构主要包括以下几个关键组件&#xff…

车载测试工具 --- CANoe VH6501 进行Not Acknowledge (NAck) 测试

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…

第40天:Web开发-JS应用VueJS框架Vite构建启动打包渲染XSS源码泄露代码审计

#知识点 1、安全开发-VueJS-搭建启动&打包安全 2、安全开发-VueJS-源码泄漏&代码审计 一、Vue搭建创建项目启动项目 1、Vue 框架搭建->基于nodejs搭建&#xff0c;安装nodejs即可 参考&#xff1a;https://cn.vuejs.org/ 已安装18.3或更高版本的Node.js 2、Vue 创建…

Axure原型图怎么通过链接共享

一、进入Axure 二、点击共享 三、弹出下面弹框&#xff0c;点击发布就可以了 发布成功后&#xff0c;会展示链接&#xff0c;复制即可共享给他人 四、发布失败可能的原因 Axure未更新&#xff0c;首页菜单栏点击帮助选择Axure更新&#xff0c;完成更新重复以上步骤即可

DeepSeek本地化部署

DeepSeek本地化部署 本教程为一键式部署&#xff0c;适合于mac、ubuntu、windows。【开源地址】 环境要求 nodejs > 18Python > 3.10.12 步骤一&#xff1a;安装ollama客户端 官网直接安装&#xff0c;ollama官网。安装完成后使用命令&#xff1a;ollama -h&#xf…

单片机学习笔记——入门51单片机

一、单片机基础介绍 1.何为单片机 单片机&#xff0c;英文Micro Controller Unit&#xff0c;简称MCU 。内部集成了中央处理器CPU、随机存储器ROM、只读存储器RAM、定时器/计算器、中断系统和IO口等一系列电脑的常用硬件功能 单片机的任务是信息采集&#xff08;依靠传感器&a…

DeepSeek-R1相关论文解读

另&#xff1a;数学推理论文篇&#xff1a;DeepSeekMath 一、DeepSeek-R1-Zero和DeepSeek R1区别 都使用了RL强化学习中的GROP&#xff0c;但是R1还使用了SFT&#xff0c;进行了多阶段训练。 1. 什么是SFT&#xff1f; SFT是给模型一些正确例子&#xff1a;情况1 answer&…

【AIGC】语言模型的发展历程:从统计方法到大规模预训练模型的演化

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;语言模型的发展历程&#xff1a;从统计方法到大规模预训练模型的演化1 统计语言模型&#xff08;Statistical Language Model, SLM&#xff09;&#xff1a;统…

ArcGIS Pro批量创建离线服务sd包

背景&#xff1a; 主要针对一个工程内有多个地图框项&#xff1a; 处理方法&#xff1a;通过Python脚本处理打包。 运行环境 在Pro的Python环境中去运行编写的Python脚本。 Python 脚本参考 import arcpy import os# Set output file names outdir r"d:\data\out&…

天津三石峰科技——汽车生产厂的设备振动检测项目案例

汽车产线有很多传动设备需要长期在线运行&#xff0c;会出现老化、疲劳、磨损等 问题&#xff0c;为了避免意外停机造成损失&#xff0c;需要加装一些健康监测设备&#xff0c;监测设备运 行状态。天津三石峰科技采用 12 通道振动信号采集卡&#xff08;下图 1&#xff09;对…

【Linux】深入理解linux权限

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;Linux 目录 前言 一、权限是什么 二、用户和身份角色 三、文件属性 1. 文件属性表示 2. 文件类型 3. 文件的权限属性 四、修改文件的权限属性和角色 1. …

三次握手,四次挥手,服务器模型(多进程并发,线程),基于套接字的UDP通信

三次握手&#xff1a; 第一次握手&#xff1a;客户端向服务器发送SYN待确认数据x, 客户端进入SYN_SEND状态​ 第二次握手&#xff1a;服务器向客户端回传一条ACK应答数据x1, 同时发送一条SYN待确认数据y&#xff0c;服务器进入SYN_RECV状态​ 第三次握手&#xff1a;客户端向服…

PostgreSQL的学习心得和知识总结(一百六十七)|深入理解PostgreSQL数据库之静态语法检查工具PgSanity的使用和实现

目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《PostgreSQL数据库内核分析》 2、参考书籍:《数据库事务处理的艺术:事务管理与并发控制》 3、PostgreSQL数据库仓库链接,点击前往 4、日本著名PostgreSQL数据库专家 铃木启修 网站…

【数据结构】双向链表(真正的零基础)

链表是一种物理存储单元上非连续、非顺序的存储结构。数据元素的逻辑顺序是通过指针的链接来实现的&#xff01;在上篇我们学习了单向链表&#xff0c;而单向链表虽然空间利用率高&#xff0c;插入和删除也只需改变指针就可以达到&#xff01;但是我们在每次查找、删除、访问..…