【车载开发系列】MISRA-C概念介绍

【车载开发系列】MISRA-C概念介绍

【车载开发系列】MISRA-C概念介绍

  • 【车载开发系列】MISRA-C概念介绍
    • 一. 什么是MISRA-C
    • 二. MISRA-C的作用
    • 三. Misra C的优势
    • 四. 使用Misra C的负面效应
    • 五. MISRA-C标准说明
      • 1)语言扩展
      • 2)类型限制
      • 3)常量
      • 4)声明与定义
      • 5)初始化
    • 六. 总结

一. 什么是MISRA-C

MISRA-C是一组针对C语言编程的编码规范,旨在提高软件质量、可靠性和可维护性。MISRA代表Motor Industry Software Reliability Association(汽车工业软件可靠性协会),该协会最初为汽车行业开发了这些规范。虽然最初是为汽车行业设计的,但MISRA-C规范已经成为其他行业的编码标准,如航空航天、医疗设备和铁路系统。
MISRA-C规范包含了一系列关于C语言编码的规则和指导,这些规则旨在减少代码中的错误、提高代码的可读性,并确保代码在不同的编译器和平台上的可移植性。这些规则通常涵盖了诸如类型转换、指针使用、内存分配、代码风格等方面。在一些高度安全和可靠性要求的行业,如汽车电子控制单元(ECU)、航空航天和医疗设备领域,遵循MISRA-C规范是一种常见的实践,有助于降低软件缺陷的风险。
MISRA-C规范的最新版本通常会随着时间的推移而更新,以反映新的技术、实践和行业标准的变化。

二. MISRA-C的作用

一辆高端汽车整车的代码行数已经突破了1亿行。那么如果这些代码都写得乱七八糟,会有顾客敢买吗?为了规范大家的写法,增强可读性,可维护性,减少代码可能出现的低级错误,于是MISRA协会制订了Misra C规范,用于规范大家的编程,提高代码整体的可靠性。
MISRA-C 编程规范的推出迎合了很多汽车厂商的需要,因为一旦厂商在程序设计上出现了问题,用来补救的费用将相当可观。
1999 年 7 月 22 日,通用汽车公司( General Motors)就曾经因为其软件设计上的一个问题,被迫召回350 万辆已经出厂的汽车,损失之大可想而知。

三. Misra C的优势

MisraC不能100%保证程序不出问题,但是能尽可能的预防,使用Misra C具有以下五个维度的优势:
1)提升可靠性
2)提升可读性
3)提升可移植性
4)提升可维护性
5)提升安全性

四. 使用Misra C的负面效应

可能会牺牲执行效率
可能会牺牲代码空间
不太注重编程风格
例如misra c:2004明确指出:不得使用联合体。这是因为,在联合体的存储方式(如位填充、对齐方式、位顺序)上,各种编译器的处理可能不同。
很多的大公司都有自己相应的代码编程规范。针对C语言尤其严谨,比如比较著名的有:华为C语言编程规范、阿里C语言编程规范和MisraC等。但是侧重点又各有不同,各类规范可能会有交集,也有自己独特的地方存在,但是大家都是致力于让程序员能写出一手更好的代码:华为、阿里的编程规范更加注重代码风格的规范。这些代码的编程规范在Misra C中是没有的。

五. MISRA-C标准说明

1)语言扩展

1 汇编语言应该被封装并隔离。
使用具体的宏定义对汇编语言进行封装

2 源代码应该使用 // 类型的注释
所有的C语言代码都要使用//类型的注释

2)类型限制

1 单纯的char类型应该只用做存储和使用字符值。
2 signed char和unsigned char类型应该只用做存储和使用数字值。
3 应该使用指示了大小和符号的 typedef以代替基本数据类型。
4 位域只能被定义为unsigned int或singed int类型,unsigned int类型的位域至少应该为 2 bits长度。

3)常量

不可以使用八进制与八进制的escape序列。

4)声明与定义

4.1 函数应当具有原型声明,且原型在函数的定义和调用范围内都是可见的。
4.2 不论何时声明或定义了一个对象或函数,它的类型都应显式声明。
4.3 函数的每个参数类型在声明和定义中必须是等同的,函数的返回类型也该是等同的。4.4 如果对象或函数被声明了多次,那么它们的类型应该是兼容的。
4.5 头文件中不应有对象或函数的定义。
4.6 外部对象或函数应该声明在唯一的文件中
4.7 具有外部链接的标识符应该具有准确的外部定义。一个对象在外部只能有一个准确的定义
4.8 在文件范围内声明和定义的所有对象或函数应该具有内部链接,除非是在需要外部链接的情况下。
4.9 static 存储类标识符应该用于具有内部链接的对象和函数的定义和声明。
4.10 当一个数组声明为具有外部链接,它的大小应该显式声明或者通过初始化进行隐式定义

5)初始化

5.1 所有自动变量在使用前都应被赋值
5.2 应该使用大括号以指示和匹配数组和结构的非零初始化构造
5.3 在枚举列表中,“=”不能显式用于除首元素之外的元素上,除非所有的元素都是显式初始化的。

六. 总结

MisraC是汽车制造业嵌入式C编码标准。
很多代码静态检查的工具里面都参照了MisraC,MisraC更加注重代码的功能性、稳定性和可维护性。
当然MisraC的标准远不止上面这些。

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

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

相关文章

[Linux]用户管理指令

开机/重启/登录/注销 进入xhsell 或者虚拟系统中, 右键桌面打开终端, 在终端执行命令, 重启或关机linux系统 建议使用普通账号登录, 如果权限不够时, 使用 su - 用户名 命令切换到超管, 然后再使用 logout命令退回到普通账号, logout 不能在图形界面的终端中使用 用户管理 Li…

Centos7.9 使用 Kubeadm 自动化部署 K8S 集群(一个脚本)

文章目录 一、环境准备1、硬件准备(虚拟主机)2、操作系统版本3、硬件配置4、网络 二、注意点1、主机命名格式2、网络插件 flannel 镜像拉取2.1、主机生成公私钥2.2、为啥有 Github 还用 Gitee2.3、将主机公钥添加到 Gitee2.3.1、复制主机上的公钥2.3.2、…

最佳植树距离 - 华为OD统一考试(E卷)

2024华为OD机试(C卷D卷E卷)最新题库【超值优惠】Java/Python/C合集 题目描述 按照环保公司要求,小明需要在沙化严重的地区进行植树防沙工作,初步目标是种植一条直线的树带。由于有些区域目前不适合种植树木,所以只能在…

电脑提示找不到msvcp110.dll怎么办?全方面详细解答

msvcp110.dll 是 Microsoft Visual C 2012 Redistributable Package 中的一个动态链接库文件。它是运行使用 Visual C 2012 开发的应用程序所必需的,包含了许多 C 标准库函数的实现。这些函数主要用于支持字符串处理、内存管理、输入输出流、异常处理等功能。 1.ms…

Clion使用vcpkg管理C/C++包

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Clion安装vcpkg二、使用步骤1.切换到清单模式2.开始安装包 三、测试代码总结 前言 Linux上的库基本都可以通过apt或yum等包管理工具来在线安装包&#xff…

C语言深入理解指针(四)

目录 字符指针变量数组指针变量数组指针变量是什么数组指针变量怎么初始化 二维数组传参的本质函数指针变量函数指针变量的创建函数指针变量的使用代码typedef关键字 函数指针数组转移表 字符指针变量 字符指针在之前我们有提到过,(字符)&am…

NLP 文本分类核心问题

解决思路 分解为多个独立二分类任务将多标签分类转化为多分类问题更换 loss 直接由模型进行多标签分类 数据稀疏问题 标注更多数据,核心解决方案: 自己构造训练样本 数据增强,如使用 chatGPT 来构造数据更换模型 减少数据需求增加规则弥补…

MELON的难题- 华为OD统一考试(E卷)

2024华为OD机试(C卷D卷)最新题库【超值优惠】Java/Python/C合集 题目描述 MELON 有一堆精美的雨花石(数量为 n,重量各异),准备送给 S和 W,MELON 希望送给俩人的雨花石重量是一致的。请你设计一…

爬虫 ----hook

目录 定义: 了解什么是hook? 举例 hook XHR请求 XMLHttpRequest 案例地址: Interceptors-拦截器 HOOK cookie操作 cookie 示范 常见的hook代码总结 1.Hook Cookie 2.Hook Header 3.Hook URL 4.Hook JSON.stringify 5.Hook JSON.parse 6.Ho…

Mac使用gradle编译springboot-2.7.x源码

1 开发环境: JDK8 ideaIU-2024.2.2 gradle-7.6.3 代理网络 2 下载springboot源码 代码仓库网址 git clone -b 2.7.x https://github.com/spring-projects/spring-boot.git3 安装gradle gradle下载网址 https://services.gradle.org/distributions/ 安装此文件指…

C语言 | Leetcode C语言题解之第415题字符串相加

题目: 题解: char* addStrings(char* num1, char* num2) {int i strlen(num1) - 1, j strlen(num2) - 1, add 0;char* ans (char*)malloc(sizeof(char) * (fmax(i, j) 3));int len 0;while (i > 0 || j > 0 || add ! 0) {int x i > 0 ?…

lsof可以查看当前系统中正在被使用的文件,包括动态库

lsof的英文是 list open files lsof直接回车,会显示很多,可以配合more命令查看 lsof | more -10 sudo lsof | more -20 lsof查看正在使用某个动态库的进程 lsof /lib/x86_64-linux-gnu/libc.so.6 lsof /usr/lib/x86_64-linux-gnu/libc.so.6 l…

如何优化苹果CMS 泛目录的缓存管理?

在使用苹果CMS进行内容管理时,缓存管理是提升网站性能的重要环节。随着技术的不断发展,泛目录插件的缓存机制也逐渐变得不再必要。(maccmscn)本文将探讨如何在不使用缓存的情况下,优化苹果CMS泛目录的性能,…

(学习记录)使用 STM32CubeMX——配置时钟(入门)

使用STM32CubeMX配置STM32F103C8T6时钟部分 选择芯片 ①:选择MCU型号 ①:这里使用英文输入法,输入你想要的芯片型号,我这里采用STM32F103C8T6 ②:这里能看到搜索后出来的芯片具体型号,选择匹配度最高的一个…

MySQL-排名函数ROW_NUMBER(),RANK(),DENSE_RANK()函数的异同

MySQL-排名函数ROW_NUMBER(),RANK(),DENSE_RANK()函数的异同 前言 假设有如下表结构与数据,class_id表示班级,需求:现在要按照班级分组,每个班级的学生进行年龄从小到大排序 一、ROW_NUMBER()函数 ROW_NUM…

Linux中的调度算法

nice值的范围有限,即为[-20, 19],也就是40个数字,优先级为[60, 99]即一共40个优先级 目前谈论的Linux操作系统叫做分时操作系统,调度的时候主要强调公平,还有一种是实时操作系统,比如智能汽车里面必须装有这…

【面经】查找中常见的树数据结构

查找中常见的树数据结构 一、二叉排序(搜索、查找)树(BST,Binary Search Tree)(1)二叉排序树的查找、插入和删除过程(2)叉树排序树的缺陷(3)二叉排…

Spark原理及调优

spark官档 hints:https://spark.apache.org/docs/3.0.0/sql-ref-syntax-qry-select-hints.html调优参数:https://spark.apache.org/docs/latest/sql-performance-tuning.html#join-strategy-hints-for-sql-queries作者几乎把所有的RDD API查了个遍&…

【服务器入门】Linux系统基础知识

【服务器入门】Linux系统基础知识 远程登录与文件传输基础命令与文本编辑vi/vim使用shell脚本基本命令1、目录操作2、文件创建与删改3、文件连接与查看 参考 目前超算使用的系统以Linux系统为主,肯定需要了解一些相关知识。本博客就以本人运行WRF模型所需&#xff0…

7-50 畅通工程之局部最小花费问题 (kruskal)

输入样例: 4 1 2 1 1 1 3 4 0 1 4 1 1 2 3 3 0 2 4 2 1 3 4 5 0输出样例: 3 代码&#xff1a; #include<iostream> #include<queue> using namespace std; const int N110; struct node{int x,y,w;bool operator <(const node &n1)const{if(wn1.w) retur…