MISRA C

news2025/1/22 9:05:59

介绍

MISRA C 是由汽车产业软件可靠性协会(Motor Industry Software Reliability Association)提出的 C 语言编程标准,可提高嵌入式系统软件的安全性和可靠性。这些指南由汽车制造商、零部件供应商和工程咨询公司合作的汽车工业软件可靠性协会 (MISRA) 发布。MISRA C 指南最初仅针对汽车行业,发展过程中,其他产业也逐渐开始使用 MISRA C,包括航空航天和国防、工业自动化、电信、国防、医疗设备、铁路等领域。
1998 年,英国汽车工业软件可靠性协会制定了一套 127 条指南,用于在安全关键系统中使用 C。

标准那么有哪些编程标准可用呢?随着人们对这个话题的兴趣越来越浓厚,C编程标准的发布:

名字程序设计语言描述
secureCCC 安全编码规则(ISO/IEC 17961:2013)。一套关于用 C 编程语言创建安全代码的规则。
CERT CC卡内基梅隆大学软件工程研究所计算机应急小组 (CERT) 部门制定的安全编码标准,为 C 编程语言的安全编码提供了规则和建议(统称为指南)。
MISRA-CC汽车工业软件可靠性协会(MISRA)的标准,使开发人员能够利用大多数 ISO C 编程语言的功能,同时帮助他们降低安全关键型汽车、医疗、工业或军事/航空应用的风险。
Embedded C Coding StandardC此 Barr Group 编码标准旨在帮助最大程度地减少固件中的错误,它详细说明了一组使用特定 C 语言概念(如数据类型、函数、预处理器宏和变量)的指南。
JPLC喷气推进实验室机构编码标准。基于 MISRA-2004 和一篇题为“The Power of 10: Rules for Developing Safety-Critical Code”(IEEE Computer,2006 年 6 月,第 93-95 页)的文章中列出的规则,该标准收集了用于提高用 C 编程语言编写的代码的安全性和可靠性的最佳可用见解,并对其进行扩展以解决与使用多线程软件相关的风险。

MISRA C 的演变

  • MISRA C:1998 – 第一版(汽车行业的原始指南)

  • MISRA C:2004 – 第二版(考虑了用户反馈和跨行业应用)

  • MISRA C:2012 – 第三版(包含对 C99 语言功能的支持,改进的强类型模型,分析关键字)

  • MISRA C:2012 (Feb 2019) – 第三版第一次修订(纳入了额外的安全准则),纳入了第 1 次修正案(AMD1)和技术勘误 1(TC1) – 也称为 MISRA C:2019

  • MISRA C:2023 (Apr 2023) – 第三版第二次修订(包含对 C11 和 C18 语言功能的支持),纳入了第 2 次(AMD2)、第 3 次(AMD3)和第 4 次(AMD4)修正案,以及技术勘误 2(TC2)。
    在这里插入图片描述
    MISRA C:2012 还包含以下补充内容:

  • MISRA C:2012 - 附录 1 显示了 MISRA C:2004 和 MISRA C:2012 之间的双向规则映射。

  • MISRA C:2012 - 附录 2 将 MISRA C:2012 映射到 ISO/IEC TS 17961:2013“C Secure”规则。

  • MISRA C:2012 - 附录 3 将 MISRA C:2012 映射到 CERT C 规则。

准则介绍

MISRA C:2012基本内容
每项 MISRA C 准则(guidelines)都被分为 “规则(Rule)“或 “指示(Directive)”:

指示是指无法提供必要的完整描述来进行合规性检查的准则。为了能够执行检查,需要额外的信息,如设计文档或需求规格中可能提供的信息。静态分析工具可以帮助检查是否符合指示,但不同的工具对不符合指示的解释可能大相径庭。

规则是对要求进行完整描述的准则。检查源代码是否符合规则应该是可能的,而不需要任何其它信息。特别是,静态分析工具应该能够检查规则的合规性,但必须遵守第 6.5 节中描述的限制。

注意后续的准则、规则、指示名词

准则分类

每条准则被分为:

  • 强制(mandatory):不允许违反
  • 必要(required):只有在有明确限制、要求和预防措施的偏离情况下才能违反
  • 建议(advisory):在合理可行的范围内遵循建议

他们的重要程度相同,区别只是是否允许偏离标准
偏离标准
允许为了某些特殊情况偏离标准,比如将 int 类型值强制转为指针来实现访问内存地址空间映射的 I/O 端口:

// 内存中的0x0002地址内数据映射了某一I/O端口数据
#define PORT (*(volatile unsigned char *)0x0002)
// 修改该位置数据就相当于修改了该I/O端口数据
PORT = 0x10u;

需要有专门的方式记录这种不得不违反 MISRA C 的地方。当然最好不要有这种违反的地方。

可判定性(Decidability)

规则(Rule)分为可判定的(decidable)和不可判定的(undecidable):

  • 可判定的: 可由静态分析工具明确给出是否符合 MISRA C 的结论(是或否)
  • 不可判定的: 不能给出明确结论,比如有些需要在编译、链接阶段或运行时才能分析出

分析的作用域(Scope)

规则(Rule)的分析的作用域分为单一翻译单元(Single Translation Unit)和系统(System)

也就是根据各种变量、函数的作用域来确定规则分析时的作用域。

extern void f(uint16_t *p);
uint16_t y;
void g(void)
{
    uint16_t x; /* x is not given a value */
    f(&x);      /* f might modify the object pointed to by its parameter */
    y = x;      /* x may or may not be unset */
}

多来源项目

项目中的代码来源于多个公司(组织):

  • 标准库来源于编译器
  • 底层驱动来源于设备厂家
  • 操作系统和上层驱动来源于特定供应厂家
  • 应用代码来自于其他厂家

特别是标准库和底层代码为了高性能会用到很多汇编以及偏离准则部分,这部分不需要符合 MISRA C 规范。
其他代码尽可能符合 MISRA C,如果推动第三方厂家配合较为困难,至少头文件(接口)要符合 MISRA C。

自动生成的代码

项目中自动生成的代码也需要遵守 MISRA C

准则格式

IdentRequirement text
Source ref
CategoryCategory
AanalysisDecidability,Scope
Applies toCxx
  • Ident: 准则的唯一序号
  • Requirement text: 准则文本
  • Source ref: 参考来源
  • Category: 准则分类
  • Decidability: 可判定性decidability,指示(Directive)无该选项
  • Scope: 分析的作用域scope,指示(Directive)无该选项
  • Cxx: C 标准(C90、C99)

引用来源

ISO C

MISRA C 引用了 C90 和 C99,注意以下的一些行为:

  • Unspecified: 未明确行为是指在 C 语言标准中没有明确规定其具体行为的情况。这意味着编译器可以根据实现的特定规则来定义其行为,但在不同的编译器或平台上可能会有不同的结果。如 x=f(&a)+g(&a),f 与 g 的执行顺序是未明确的,而且其执行顺序可能影响到 x 的最终结果。
  • Undefined: 未定义行为是指当程序违反了 C 语言标准规范,导致编译器无法确定其具体行为时发生的情况。例如,对指针进行未初始化的解引用、数组越界访问、除以零等操作都属于未定义行为。最重要的是编译器没有责任去检查这些错误,导致这些问题无法在编译阶段暴露。
  • Implementation-defined": 实现定义行为是指 C 语言标准规定了多个可能的行为,但具体的行为由编译器或平台的实现决定。这意味着在不同的编译器或平台上,同一段代码可能会有不同的行为,但这些行为都是符合标准的。应尽量避免该行为来保证代码在不同编译器上的一致性和可移植性。
  • Locale: 本地化行为,和 C 语言的本地化相关,比如字符的使用习惯、日期格式等,这里不涉及。

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

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

相关文章

STM32G4系列之DAC

一、STM32G4单片机有几个DAC外设? STM32G4单片机共有4个DAC,两个为低速DAC(采样率1MHz),两个为高速DAC(采样率15MHz)。共包括7个通道,3个外部通道和4个内部通道。 三个外部DAC包括DAC1和DAC2,其可以映射到外部管脚&am…

捕获野生的登录页,暴改Vue3

1.实现效果 2.Vue组件 <script setup> import {onMounted} from "vue";onMounted(()>{// getAllData() }) </script><template><div class"login"><div class"form-cont"><div class"form-top"&…

论文阅读_优化RAG系统的检索

英文名称: The Power of Noise: Redefining Retrieval for RAG Systems 中文名称: 噪声的力量&#xff1a;重新定义RAG系统的检索 链接: https://arxiv.org/pdf/2401.14887.pdf 作者: Florin Cuconasu, Giovanni Trappolini, Federico Siciliano, Simone Filice, Cesare Campag…

echarts实现堆叠图加折线混合图

vue组件实现代码&#xff1a; <template><div :id"chartId" style"width: 100%; height: 300px"></div> </template><script>import * as echarts from "echarts";export default {name: "doubleStackLine&…

基于SpringBoot漫画网站系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

istitle()方法——判断首字母是否大写其他字母小写

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 istitle()方法用于判断字符串中所有的单词首字母是否为大写而其他字母为小写。istitle()方法的语法格式如下&#xff1a; str.istitle() …

Vite: 高阶特性 Pure ESM

概述 ESM 已经逐步得到各大浏览器厂商以及 Node.js 的原生支持&#xff0c;正在成为主流前端模块化方案。 而 Vite 本身就是借助浏览器原生的 ESM 解析能力( type“module” )实现了开发阶段的 no-bundle &#xff0c;即不用打包也可以构建 Web 应用。不过我们对于原生 ESM 的…

数据倾斜优化:Hive性能提升的核心

文章目录 1. 定义2. 数据倾斜2.1 Map2.2 Join2.3 Reduce 3. 写在最后 1. 定义 数据倾斜&#xff0c;也称为Data Skew&#xff0c;是在分布式计算环境中&#xff0c;由于数据分布不均匀导致某些任务处理的数据量远大于其他任务&#xff0c;从而形成性能瓶颈的现象。这种情况在H…

==和equals的区别(面试题)

和equals有什么区别 对于基本数据类型&#xff0c;比较的是值是否相等&#xff0c;对于引用类型则是比较的地址是否相等&#xff1b;对于equals来说&#xff0c;基本数据类型没有equals方法&#xff0c;对于引用类型equals比较的是引用对象是否相同 那针对以上结论&#xff0c…

RabbitMq教程【精细版一】

一、引言 模块之间的耦合度过高&#xff0c;导致一个模块宕机后&#xff0c;全部功能都不能用了&#xff0c;并且同步通讯的成本过高&#xff0c;用户体验差。 RabbitMQ引言 二、RabbitMQ介绍 MQ全称为Message Queue&#xff0c;消息队列是应用程序和应用程序之间的通信方法。…

python工作目录与文件目录

工作目录 文件目录&#xff1a;文件所在的目录 工作目录&#xff1a;执行python命令所在的目录 D:. | main.py | ---data | data.txt | ---model | | model.py | | train.py | | __init__.py | | | ---nlp | | | bert.py | …

DIVE INTO DEEP LEARNING 56-60

文章目录 56 Gated Recurrent Unit(GRU)56.1 Motivation: How to focus on a sequence56.2 The concept of doors56.3 Candidate hidden state56.4 hidden state56.5 summarize56.6 QA 57 Long short-term memory network57.1 Basic concepts57.2 Long short-term memory netwo…

Linux 进程信号篇

文章目录 1. 生活中的信号2. 信号的概念3. 信号的产生3.1 系统调用3.2 软件条件3.2 异常3.3 Core和Term的区别 4. 信号的保存5. 信号的处理5.1 地址空间的进一步理解5.2 键盘输入数据的过程5.3 理解OS如何正常运行5.3.1 OS如何运行5.3.2 如何理解系统调用 5.4 内核态和用户态 6…

YOLO-V1

一、YOLO-V1整体思想与网络架构 1.1 YOLO算法整体思路解读 YOLO-V1: 经典的one-stage方法 把检测问题转化成回归问题&#xff0c;一个CNN就搞定了&#xff01; 可以对视频进行实时检测&#xff0c;应用领域非常广&#xff01; 核心思想&#xff1a; 1、预测一张图像中有哪些物…

AI大模型的崛起:第四次工业革命的前奏?

在当今这个信息爆炸的时代&#xff0c;人工智能&#xff08;AI&#xff09;大模型的崛起引起了广泛的关注和讨论。有人将其视为第四次工业革命的前奏&#xff0c;然而&#xff0c;这真的可能吗&#xff1f;本文将探讨这一问题&#xff0c;并对中国AI大模型的发展进行简要分析。…

鸿蒙开发Ability Kit(程序框架服务):【向用户申请授权】

向用户申请授权 当应用需要访问用户的隐私信息或使用系统能力时&#xff0c;例如获取位置信息、访问日历、使用相机拍摄照片或录制视频等&#xff0c;应该向用户请求授权&#xff0c;这部分权限是user_grant权限。 当应用申请user_grant权限时&#xff0c;需要完成以下步骤&a…

推荐系统三十六式学习笔记:原理篇.模型融合14|一网打尽协同过滤、矩阵分解和线性模型

目录 从特征组合说起FM模型1.原理2.模型训练3.预测阶段4.一网打尽其他模型5.FFM 总结 在上一篇文章中&#xff0c;我们讲到了使用逻辑回归和梯度提升决策树组合的模型融合办法&#xff0c;用于CTR预估&#xff0c;给这个组合起了个名字&#xff0c;叫“辑度组合”。这对组合中&…

鸿蒙开发设备管理:【@ohos.multimodalInput.inputEventClient (注入按键)】

注入按键 InputEventClient模块提供了注入按键能力。 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。本模块接口均为系统接口&#xff0c;三方应用不支持调用。 导入模块 import inputEventCli…

小白学webgl合集-绘制有透视颜色不一样的立方体

效果 原理 结合透视矩阵和视觉矩阵进行绘制 知识点 01透视矩阵 透视矩阵将视图空间中的坐标转换为裁剪空间中的坐标&#xff0c;使得更远的物体看起来更小。 function perspectiveMatrix(fov, aspect, near, far) {const f 1.0 / Math.tan(fov / 2);const nf 1 / (near …