MISRA C 和MISRA C++:汽车软件安全的守护者

一、MISRA C与C语言

自1972年Dennis MacAlistair Ritchie在美国贝尔实验室创造C语言以来,它已成为当今最流行的编程语言之一。C语言以其使用的灵活性、功能的丰富性而广受欢迎,但同时也因其宽松的语法和不严格的数据类型给开发的产品带来了安全隐患。

1989年,ANSI发布了C89标准,标志着C语言标准化的重要一步。随后,C99标准在1999年发布,引入了多项新特性,如几类新的数据类型和更强大的字符串处理功能。

随着嵌入式系统在汽车行业的广泛应用,英国政府于90年代初启动了“SafeIT”研究计划,旨在为道路车辆电子系统的嵌入式软件开发制定安全指南。这份文件具有重要意义,代表了行业共识,也是汽车行业第一种功能安全方法,比国际层面的ISO 26262工作开始早了大约10年。

由汽车工业软件可靠性协会(Motor Industry Software Reliability Association,即MISRA)制定的一套针对于C语言的编码规范,作为响应该指南的产物,为汽车行业提供了一种功能安全方法,MISRA C由此诞生。

MISRA C规范包括一系列规则和指导原则,分为强制规范(Mandatory guidelines)、要求规范(Required guidelines)和建议规范(Advisory guidelines)。这些规范覆盖了编程实践、代码设计等多个方面,旨在帮助开发者编写出更加安全和可靠的代码。

MISRA C规范包含以下核心原则:

 1、未定义行为的限制(Undefined Behavior)

MISRA C通过制定规则来限制数组越界、指针解引用等未定义行为。例如,规则指导开发者避免使用未初始化的指针,以及确保数组索引不会超出其界限。

例如:Dir 4.12       Dynamic memory allocation shall not be used.

代码如下:

#include <stdlib.h>

void f ( void )

{

char *p = ( char * ) malloc ( 10 );

char *q;

free( p );

q = p;          /* 未定义行为 —— 此时p的值不确定 */

p = ( char * ) malloc ( 20 );

free( p );

p = NULL       /* 将释放的指针赋值为NULL —— 此时p的值为确定 */

}

 2、类型安全(Type Safety)

MISRA C强制类型匹配和显式类型转换,以增强代码的类型安全性。例如,它要求在进行隐式类型转换时必须进行适当的检查,以避免数据丢失或意外行为。

C语言不要求强制检查所有的显示转换,允许不兼容的类型之间进行转换。

比如在不考虑数据容量的情况下,整型数据间的隐式转换可以参考下面的表格。

(Note:si——有符号32位;ui——无符号32位;uc——无符号8位)

表达式

变格

符号平衡

变换

说明

si = si + si;

si = uc + uc;

uc的符号变格为有符号32位

ui =si + ui;

si的符号平衡为无符号32位

ui = ui + uc;

uc的符号变格为有符号32位再平衡为无符号32位

ui = si;

si的符号变换为无符号32位

ui = uc + uc;

uc的符号变格为有符号32位后结果变换为无符号32位

si = si +ui;

si的符号平衡为无符号32位后结果变换为有符号32位

si = ui +uc;

uc的符号变格为有符号32位,平衡为无符号32位后结果为有符号32位

3、资源管理(Resource Management)

MISRA C强调正确管理内存分配和释放,避免内存泄漏。它提供了关于动态内存分配的最佳实践,包括何时使用以及如何正确释放内存。

分配内存的常用的标准库函数是malloc,对应释放内存的是free。

例如:Rule 22.2     A block of memory shall only be freed if it was allocated by means of a Standard Library function。

#include <stdlib.h>

void fn ( void )

{

int a;

free(&a); /* NG——此内存空间不是有库函数分配 */
}

void g ( void )

{

        char *p = ( char *)malloc(512);

        char *q = p; /* 两个指针指向同一空间 */

        free( p );  /* OK——通过p指针,内存第1次释放 */

        free( q );  /* NG——通过q指针,内存第2次释放 */

}

 4、函数与宏的使用(Function and Macro Usage)

MISRA C推荐优先使用函数而非宏,以减少错误。它还规定了函数的返回类型和参数使用,以增强代码的可读性和可维护性。例如,建议使用返回类型为void的函数来执行操作,而不是返回状态码。

例如:Dir 4.9 A function should be used in preference to a function-like where they are interchangeable.

另外,在代码调试的时候,函数可以进行单步调试,有利于发现问题,反而宏就没有这个优势了。

 5、控制流(Control Flow)

MISRA C对控制流语句使用有严格规定,限制’goto’语句,鼓励使用结构化控制语句如`if`、`while`和`for`循环。

例如:Rule 15.1     The goto statement should be used

在开发设计时,所有的数据流都已经明确的情况下,则可以禁止引入’goto’。

 6、错误处理(Error Handling)

MISRA C提供错误处理指导,帮助开发者以一致和可预测的方式处理错误。例如,它建议使用标准化的错误代码和清晰的错误处理流程。

 7、可移植性(Portability)

MISRA C鼓励使用可移植的代码实践,避免依赖特定编译器或平台特性。这包括使用标准库函数和避免平台特定的扩展。

 8、代码风格与格式化(Coding Style and Formatting)

虽然主要关注安全性和可靠性,MISRA C也提供了代码风格和格式化的建议,以提高代码的可读性。这包括命名约定、缩进和注释的使用。

二、MISRA C++——MISRA C的继承

1978年,一门新型开发语言同样诞生于美国贝尔实验室,这门开发语言就是C++。

说到MISRA C++的发展历史,AUTOSAR C++是一个绕不过去的关键点。

众多汽车厂商于2003年组建了AUTOSAR开发联盟,发布了汽车开放系统架构(Automotive Open Software Architecture,即AUTOSAR)和经典平台(Classic Platform),后期为了满足高度自动驾驶和汽车互联应用的快速发展,于2017年发布了第一个版本的自适应平台(Adaptive Platform),至此也决定了C++的领先地位。

随着汽车系统的复杂化加深,C++已经处于曾经C语言的高度。但多数人认为,C++不应该用于关键系统。因此,一套类似于“MISRA C”、适用于C++的指导于2008年发布。这就是MISRA C++的初版,也就是MISRA C++:2008。

AUTOSAR C++:14规范是基于MISRA C++:2008进行补充完善的,填补 C++11和C++14 在关键和安全相关软件中使用时缺乏适当编码标准的空白。

MISRA C++:2023 是 MISRA C++ 标准的下一个版本,它将整合 AUTOSAR C++:14 规范,并支持 C++ 的最新版本,是汽车行业和其他使用嵌入式系统行业的最佳标准之一。

MISRA C++ 标准包含一系列的规则和指导原则,它们分为不同的类别,如强制性、推荐性等。这些规则帮助开发者避免使用可能导致不安全或不可预测行为的语言特性,同时鼓励使用那些能够提高代码质量和可维护性的编程实践。

MISRA C++:2023 标准的特点包括:

整合了 AUTOSAR C++:14规范,共有 179 条准则。

规则按照性质分为两类:Rule(规则)和 Directive(指令),包含 175 条 Rule 和 4 条 Directive。

支持C++的最新特性,同时确保代码的安全性和可靠性。

MISRA C++标准的使用可以提高嵌入式系统的安全性和可移植性,特别是在那些对安全性要求极高的应用中。通过遵循这些指南,开发者可以减少编程错误,提高代码质量,确保软件系统的稳定性和可靠性。

三、MISRA C、MISRA C++与静态测试

静态测试是软件测试的一种方法,它不涉及程序的执行,而是通过分析源代码来检测潜在的错误和代码质量问题。MISRA C、MISRA C++与静态测试紧密相关,因为 MISRA C、MISRA C++标准提供了一套规则和指南,静态测试工具可以使用这些规则来自动检测代码是否符合 MISRA C、MISRA C++标准。

使用静态测试工具来执行MISRA C、MISRA C++标准的检查可以带来以下好处:

1. 早期发现缺陷:在编码阶段就能发现潜在的问题,减少后期修复的成本和复杂性。

2. 提高代码质量:确保代码遵循行业认可的最佳实践,提高软件的整体质量和可靠性。

3. 符合行业标准:对于需要遵守特定行业安全标准的项目,如汽车行业的 ISO 26262,静态测试可以帮助确保代码符合这些标准。

4. 自动化:自动化的代码分析可以节省时间,减少人为错误,提高开发效率。

5. 一致性:确保整个项目或团队遵循统一的编码标准,提高代码的一致性和可维护性。

总的来说,MISRA C、MISRA C++与静态测试的结合为嵌入式系统的软件开发提供了一种高效且可靠的质量保证方法,有助于提升软件安全性并减少风险。

目前市场上静态测试工具有很多,PC-lint Plus是Vector公司出品的一套全面的、轻量级的C/C++代码静态分析工具。

在MISRA C方面,PC-lint Plus提供对MISRA C:2012规范及上一代版本MISRA C:2004规范的支持,在MISRA C++方面,PC-lint Plus提供AUTOSAR C++规范及后续的MISRA C++规范的支持。

这种支持通过标准PC-lint Plus消息和专用于特定MISRA规则的可选性来实现。如果大家有该方面的需求,可以直接留言或联系邮箱market@dotrustech.com

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

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

相关文章

如何批量给文件名添加编号?这个方法速度快!操作简单!

如何批量给文件名添加编号&#xff1f;这个方法速度快&#xff01;操作简单&#xff01;批量给文件重命名&#xff0c;这个是在工作中和生活中经常要用到的一个小技巧&#xff0c;许多人还不知道怎么操作&#xff0c;当然如果要按一定的格式和规律重命名大量的文件&#xff0c;…

Linux内核 -- 多核通信之RPMSG驱动使用

Linux Kernel RPMsg 驱动注册流程的高级用法与注意事项 在Linux Kernel中&#xff0c;RPMsg&#xff08;Remote Processor Messaging&#xff09;是一种用于不同处理器之间通信的机制&#xff0c;通常用于多核系统中的通信&#xff0c;如主处理器和协处理器之间的消息传递。了…

巴西电子游戏PWA借助海外快手kwai社交广告出海趋势解读

巴西电子游戏PWA借助海外快手kwai社交广告出海趋势解读 在数字化时代的浪潮中&#xff0c;电子游戏行业蓬勃发展&#xff0c;而广告投放策略也随之日新月异。特别是在巴西这样一个充满活力的市场&#xff0c;电子游戏的普及与流行程度不容小觑。在这样的背景下&#xff0c;在数…

java数据结构集合复习之ArrayList与顺序表

前言: 这是我最一年学习java的一部分的回顾总结 1.List 1.1什么是List? 在框架集合中,List是一个接口,继承自Collection。 Collection也是一个接口&#xff0c;该接口中规范了后序容器中常用的一些方法&#xff0c;具体如下所示 --------boolean add(E e)尾插 evoid a…

[pwn]静态编译

静态编译 1. 栈足够大的情况下 程序在ida打开后&#xff0c;左侧的函数栏目没有红色&#xff08;系统调用的函数&#xff09;&#xff0c;而只有一些静态函数&#xff0c;通常这类文件的大小会必普通的pwn题程序要大得多。 这种静态编译的题没有调用库函数&#xff0c;也就没…

百度云智能媒体内容分析一体机(MCA)建设

导读 &#xff1a;本文主要介绍了百度智能云MCA产品的概念和应用。 媒体信息海量且复杂&#xff0c;采用人工的方式对视频进行分析处理&#xff0c;面临着效率低、成本高的困难。于是&#xff0c;MCA应运而生。它基于百度自研的视觉AI、ASR、NLP技术&#xff0c;为用户提供音视…

Vue 性能革命:揭秘前端优化的终极技巧;Vue优化技巧,解决Vue项目卡顿问题

目录 Vue优化路径 一、使用key 二、使用冻结对象 三、使用函数式组件 四、使用计算属性 五、使用非实时绑定的表单项 六、保持对象引用稳定 6.1、保持对象引用稳定定义 6.2、保持对象引用稳定与不稳定的例子 6.3、vue2判断数据是否变化是通过hasChanged函数实现的 ①…

2024年【四川省安全员B证】考试及四川省安全员B证考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【四川省安全员B证】考试及四川省安全员B证考试题&#xff0c;包含四川省安全员B证考试答案和解析及四川省安全员B证考试题练习。安全生产模拟考试一点通结合国家四川省安全员B证考试最新大纲及四川省安全员B证…

golang项目中gorm框架的配置和具体使用

最近在改造golang项目&#xff0c;从postgre数据库迁移到达梦数据库&#xff0c;我还想在改造后的项目使用 gorm 操作数据库&#xff0c;保持较小的改动。查找了不少资料&#xff0c;最终从以下两篇文章中借鉴了不少 1、Gorm 入门介绍与基本使用 这篇知乎文章详细介绍了 gorm 框…

C语言 -- 操作符详解​

C语言 -- 操作符详解​ 1. 操作符的分类2. 二进制和进制转换​2.1 2进制转10进制​2.1.1 10进制转2进制数字​ 2.2 2进制转8进制和16进制​2.2.1 2进制转8进制​2.2.2 2进制转16进制​ 3. 原码、反码、补码​4. 移位操作符​4.1 左移操作符​ 4.2 右移操作符​5. 位操作符&…

Symfony实战手册:PHP框架的高级应用技巧

引言 Symfony是一个功能强大且广泛应用于PHP应用程序开发的框架&#xff0c;它提供了许多高级特性和工具&#xff0c;可以帮助开发人员更高效地构建和管理复杂的Web应用程序。以下是Symfony框架的几个关键方面及其高级应用技巧&#xff1a; 1. 路由和控制器 Symfony的路由组…

suricata7 rule格式

suricata 7.0.5 suricata rule由三部分组成&#xff0c; action, header, options action,决定当前规则匹配上后需要执行的动作header,定义当前规则的协议&#xff0c;IP地址&#xff0c;端口&#xff0c;方向options,定义了具体的规则 一、 action 合法的action值有&#x…

Linux_共享内存通信

目录 1、共享内存原理 2、申请共享内存 2.1 ftok 2.2 测试shmget、ftok 2.3 查看系统下的共享内存 3、关联共享内存 3.1 测试shmat 4、释放共享内存 4.1 测试shmctl 5、实现共享内存通信 6、共享内存的特性 结语 前言&#xff1a; 在Linux下&#xff0c;有一…

爆!Java高级特性之Stream API详解

爆&#xff01;Java高级特性之Stream API详解 Java 8引入的Stream API可以说是一个革命性的特性,让我们告别了又臭又长的for循环,迎来了函数式编程的春天。今天就让我们来一起深入了解这个让人又爱又恨的Stream API吧! 什么是Stream? Stream就像一个高级的迭代器,允许我们以…

分支与循环

目录 1. if语句 1&#xff09;if 2) else 3&#xff09;分支中包含多条语句 4&#xff09;if嵌套 2.关系操作符 3.条件操作符 4.逻辑操作符&#xff1a;&& || ! 1) 逻辑取反运算符 !​编辑 2 与运算符​编辑 3) 或运算符​编辑 4) 闰年的判断 5) 短路 …

LangChain 概述 (模块索引)

文章目录 一、下载二、核心功能1、流式传输 streaming 三、LCEL四、组成部分1、Promp template2、Example selectors (示例选择器)3、Chat models (聊天模型)4、Messages (消息)5、LLMs (大语言模型) 一、下载 二、核心功能 其中包括以下内容&#xff1a; 从模型中返回结构化的…

若依 Vue 前端分离 3.8.8 版中生成的前端代码中关于下拉框只有下拉箭头的问题

生成代码修改前 <el-form-item label"课程学科" prop"subject"><el-select v-model"queryParams.subject" placeholder"请选择课程学科" clearable><el-optionv-for"dict in course_subject":key"dict…

Mysql中常用函数的使用示例

场景 基础知识回顾&#xff1a;mysql中常用函数的使用示例。 注&#xff1a; 博客&#xff1a;霸道流氓气质-CSDN博客 实现 数学函数 -- ABS(x)返回x的绝对值 SELECT ABS(-1),ABS(2); -- PI()返回圆周率 SELECT PI(); -- SQRT(x)返回非负数x的二次方根 SELECT SQRT(4); -…

【博士每天一篇文献-算法】Adult neurogenesis acts as a neural regularizer

阅读时间&#xff1a;2023-12-20 1 介绍 年份&#xff1a;2022 作者&#xff1a;Lina M. Tran&#xff0c;Adam Santoro&#xff0c;谷歌DeepMind 期刊&#xff1a; Proceedings of the National Academy of Sciences 引用量&#xff1a;13 代码&#xff1a;https://github.c…

A4-C四驱高防轮式巡检机器人

在当今数字化和智能化迅速发展的时代&#xff0c;旗晟智能带来了一款革命性的创新产品——A4-C四驱高防轮式巡检机器人。这款机器人以其卓越的性能和多功能性&#xff0c;为工业巡检领域带来了全新的解决方案。 一、产品亮点 1、四驱动力与高防护设计 四驱高防轮式巡检机器人…