MISRA C

介绍

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.mzph.cn/pingmian/38299.shtml

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

相关文章

基于STM32的智能农业环境监控系统

目录 引言环境准备智能农业环境监控系统基础代码实现:实现智能农业环境监控系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景:农业环境管理与优化问题解决方案与优化收尾与总结 1. 引言 智能农业环境监控系…

ComfyUI高清放大的四种方式(工作流附件在最后)

方式一:Latent放大工作流 1.工作流截图 方式二:ESRGAN(传统模型)放大工作流 方式三:算法放大(后期处理)工作流 方式四:Ultimate SD Upscale工作流 这个方式的优势是对于显存底的用…

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

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

2024深圳入户新规出炉!快速了解你的入户“绿色通道”

​朋友们,听说你们都在琢磨深圳户口这事儿?没买房的也想来凑凑热闹,其实,深圳户口不仅仅是为了买房,更多的是为了孩子教育、住房申请、医疗福利等等。各位想在深圳这片热土上大展拳脚的朋友们,现在好消息来…

Spring 动态增强逻辑执行分析

1、假如UserService中存在被增强的public 普通方法,那么spring ioc时就会创建对应的代理对象放置到容器中; 2、那么Controller中注入的userService就是代理对象; Service public class UserService {Transactionalpublic void f2(String us…

python open函数中文乱码怎么解决

首先在D盘下新建一个html文档,接着在里面输入含有中文的Html字符,使用中文格式对读取的字符进行解码,再用utf-8的模式对字符进行编码,然后就能正确输出中文字符。 代码如下: # -*- coding: UTF-8 -*- file1 open(&quo…

5G NR PUSCH物理层过程

物理层过程 加扰 假设要在单个码字q上传输的bit块为 b ( q ) ( 0 ) , . . . , b ( q ) ( M b i t ( q ) − 1 ) b^{(q)}(0),...,b^{(q)}(M_{bit}^{(q)} - 1) b(q)(0),...,b(q)(Mbit(q)​−1) ,其中 M b i t ( q ) M_{bit}^{(q)} Mbit(q)​是总比特数,加…

架构师篇-9、从事件风暴到微服务设计的落地过程

用户付款功能第二个版本的设计实现 单一职责原则(SRP) 软件系统中的每个元素只完成自己职责内的事,将其他的事交给别人去做“职责”通常人理解为一个事情,与该事情相关的事都是它的责任 一个职责是软件变化的一个原因 第二次需求…

设计模式-状态模式和策略模式

1.状态模式 1.1定义 当一个对象的内在状态改变时允许根据当前状态作出不同的行为; 1.2 适用场景 (1)一个对象的行为取决于它的状态,并且它必须在运行时根据状态来决定其行为. (2)代码中包含了大量的与状态有关的条件语句,例如:一个操作含有庞大的多分值语句(if…

pytest测试框架pytest-random-order插件随机执行用例顺序

Pytest提供了丰富的插件来扩展其功能,本章介绍下pytest-random-order插件,随机设置pytest测试用例的运行顺序,并对随机性进行一些控制。 官方文档: https://pytest-cov.readthedocs.io/en/latest/index.html 适配版本说明&#x…

Crontab命令详解:轻松驾驭Linux定时任务,提升系统效率

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》《MYSQL》 💪🏻 制定明确可量化的目标,坚持默默的做事。 引言: crond是Linux系统中用来定期执行命令或指定程序任务的一种服务或软件…

AI agent是什么,什么技术栈

AI agent,也称为会话代理或聊天机器人, 是一种通过文本或语音模拟人类对话的计算机程序。 它们旨在以自然且引人入胜的方式理解和响应用户输入。 AI agent 被广泛用于各种应用中,包括客户服务、营销、 销售和教育。 有两种主要类型的 AI agen…

Qt开发报错:Q_INTERFACES Error: Undefined interface

1、背景 VS2019qt5.12.10 从svn拉下来的项目,结果报错: Q_INTERFACES Error: Undefined interface 之前在VS的扩展中在线安装了qt插件, 安装了一半,比较慢,直接强行退出了。。 后来安装了qt官网的插件。。。。 2、报…

nginx架构学习

前言 这篇文章主要记录下对nginx架构的学习记录。 架构设计 优秀的模块化设计 高度模块化的设计是Nginx的架构基础。在Nginx中,除了少量的核心代码,其他一切皆 为模块。 在这5种模块中,配置模块与核心模块都是与Nginx框架密切相关的&…

Pharmacy Management System v1.0 文件上传漏洞(CVE-2022-30887)

前言 CVE-2022-30887 是一个存在于 Pharmacy Management System v1.0 中的远程代码执行(RCE)漏洞。这个漏洞存在于 /php_action/editProductImage.php 组件中。攻击者可以通过上传一个精心制作的图像文件来执行任意代码。 漏洞详细信息 漏洞描述: Pha…

第二十三课,再识字符串

前言,再识字符串 字符串是我们学习python编程第一眼见到的东西,一行print(“hello world”)可谓是太亲切了,但在此之前我们对字符串的认知也仅局限于如何用单引号、双引号、三引号去定义字符串并打印,今天开始我们就更深入地去理…

【大数据】StarRocks的系统架构

StarRocks 架构简洁,整个系统的核心只有 FE(Frontend)、BE (Backend) 或 CN (Compute Node) 两类进程,方便部署与维护,节点可以在线水平扩展,元数据和业务数据都有副本机制,确保整个系统无单点。…

轻松解锁电脑强悍性能,4000MHz的玖合星舞 DDR4 内存很能打

轻松解锁电脑强悍性能,4000MHz的玖合星舞 DDR4 内存很能打 哈喽小伙伴们好,我是Stark-C~ 很多有经验的电脑玩家在自己DIY电脑选购内存条的时候,除了内存总容量,最看重的参数那就是频率了。内存频率和我们常说的CPU主频一样&…

通用管理页面的功能实现

在Windows Forms(WinForms)应用程序中,创建一个通用的管理页面通常涉及对数据的增删改查(CRUD)操作,以及一些额外的功能,如数据过滤、排序、导出和导入等。 先看一个仓库管理页面要素。 仓库管…

uniapp开发H5、手机APP、微信小程序 可拖动菜单按钮

ml-fab 插件地址:https://ext.dcloud.net.cn/plugin?id18909 1、可拖拽悬浮按钮 ml-fab,支持自定义插槽,点击可展开一个图标按钮菜单,可随意拖拽。 2、支持自定义插槽,可实现自定义配置。 3、操作简单易上手。 ml-f…