第七十七篇:车辆安全-车载软件C++语言开发指南(AUTOSAR C++)

这篇具有很好参考价值的文章主要介绍了第七十七篇:车辆安全-车载软件C++语言开发指南(AUTOSAR C++)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C++是面向对象的编程,比C语言更加复杂,抽象程度高,但C++在一些图像处理、系统、控件的编程方面,实用性更强,具有自己的编程优势。在车载嵌入式系统的开发中,C和C++都具有重要的作用。C++语言所使用的面向对象的编程技术如封装、继承和多态性极大的提高了在大规模嵌入式编程应用中代码的可读性、可重用性和可移植性。C++在嵌入式系统中广泛使用的主要原因包括:

  1. C++为许多嵌入式系统所必需的高速、低级输入/输出操作提供了良好的支持;
  2. 应用程序复杂性的增加使得使用高级预语言比汇编语言更适合;
  3. C++编译器可以生成与C具有相似大小和RAM要求的代码;
  4. C++支持使用面向对象的设计方法;
  5. 在低成本硬件上移植性的要求的增长;
  6. 从建模包中自动生成C++代码的使用增加;
  7. 对开发系统和托管环境的兴趣日益增加,C++是一种可能的语言选择;

因此,在辅助驾驶、无人驾驶等软件系统的开发中,C++被广泛的应用。针对C++在汽车工业领域的安全规范也逐渐完善。AUTOSAR C++是ISO/IEC 14882标准在汽车工业子领域的应用规范。

一、AUTOSAR C++规范

AUTOSAR C++是MISRA C++:2008的更新,也是汽车工业领域的安全性编程规范,但AUTOSAR C++不仅限应用于汽车工业领域,也可以应用在其他的嵌入式系统。。在AUTOSAR C++之前,MISRA C++ 2008是C++在汽车等关键领域的编程指导规范。随着C++的标准不断的更新,MISRA C++ 2008已经不包括对C++11/14的规范要求。AUTOSAR C++ 的一些列规范在此背景下发布,弥补了MISRA C++:2008的不足。在MISRA C++:2008基础上,AUTOSAR C++:14的演变为:

  • C++语言的实质性演变/改进;
  • 在安全相关和关键环境中更广泛的使用面向对象的语言;
  • 可用的更好编译器;
  • 提供适合C++的更好的测试、验证和分析工具;
  • 提供更好的开发方法(如持续集成),以便更早的检测/处理错误;
  • 安全工程师对面向对象的编程语言的接受程度更高;
  • 开发团队对功能强大的C++语言特性的强烈需求;
  • 构建ISO 26262安全标准,包括HIC++, JSF++, CERTC++,C++核心指南;

除此之外,AUTOSAR在MISRA C++:2008基础之上指定了:

  • 哪些MISRA C规则已经过时,不需要遵守;
  • 一些更新的MISRA规则;
  • 一些额外的规则;

与MISRA-C一样,AUTOSAR C++的规范中的规则根据义务等级进行规则划分为:必需(强制性)、建议性。根据静态分析执行规则可以划分为:自动化、部分自动化、非自动化。绝大多数的规则都是能够通过静态分析自动强制执行。除此之外,这些规则还可以根据被分配的目标分类为:实施(代码、软件设计、架构)、验证(代码审查、分析、测试)、工具链(预处理器、编译器、链接器、编译器库)、基础设施(运行系统、硬件)。

二、AUTOSAR C++对安全性的理解

C++语言的不安全性主要来源有:开发者犯错、开发者对C++的误解、编译器不执行开发人员所期望的操作、编译器包含错误、运行是的错误。

  1. 开发者犯错:
    开发人员会犯很简单的错误,比如错误地输入了一个变量名,也可能会犯一些诸如误解了一个算法这样的复杂错误。编程语言与这种类型的错误有关。首先,语言的风格和表达性可以帮助或阻碍程序员清晰地思考算法。其次,该语言可以使输入错误将一个有效的构造变成另一个有效的(但无意的)构造变得容易或困难。第三,编译器在出现错误时可能检测到也可能不检测到错误,其主要原因如下:
    首先,在风格和表达性方面,C++可以用来编写布局良好、结构化和表达性强的代码。它还可以用来编写反常的和极其难以理解的代码。显然,后者在与安全相关的系统中是不可接受的。
    其次,C++的语法是相对容易犯输入错误,从而导致完全有效的代码。例如,键入“=”(赋值)而不是“==”(逻辑比较)太容易了,结果几乎总是有效的(但错误的),而在if语句的末尾加上一个额外的分号可以完全改变代码的逻辑。
    最后,C++的哲学是假设开发者知道他们正在做什么,这可能意味着如果出现错误,编译器允许开发者不注意这些错误而通过编译。在这方面,C++特别弱(尽管比C好)的一个领域是“类型检查”。C++不会反对程序员尝试在一个bool类型中存储一个浮点数。大多数这样的不匹配只是被迫变得兼容。如果 C++ 有一个方形钉和一个圆孔,它不会抱怨,而是让它们适合!
    示例:
    规则:M6-2-1: (强制性,实施,自动化)赋值运算符不得用于子表达式
x = y; 
x = y = z; // 不合规 
if ( x != 0 ) // 合规
{         foo ( ); 
}
bool b1 = x != y; // 合规
bool b2; 
b2 = x != y; // 合规
if ( ( x = y ) != 0 ) // 不合规 
{         foo ( ); 
}
if ( x = y ) // 不合规 
{         foo ( ); 
}
if ( int16_t i = foo ( ) ) // 合规 
{ 
}
  1. 开发者对C++的误解:
    开发人员可能会误解一种语言中构造的效果。有些语言比其他语言更容易产生这种误解。C语言++语言有许多领域容易出现开发人员引入的错误。例如,操作符优先级的规则定义良好,但很复杂,而且开发人员很容易在表达式中做出不正确的假设。
    示例:
    M5-0-2: 建议,实施,部分自动化)表达式中的 C++ 运算符优先规则应受到有限的依赖。
//何时强制性括号
赋值运算符的右侧操作数不强制性括号,除非右侧本身包含赋值表达式:
x = a + b; // 可以接受的
x = (a + b); // () 是不需要的

一元运算符的操作数不强制性括号:
x = a * -1; // 可以接受的
x = a * (-1); // () 不需要

否则,二元和三元运算符的操作数应为强制转换表达式(参见 ISO/IEC 14882:2003 [1] 的第 5.4(2) 节),除非表达式中的所有运算符都相同
x = a + b + c; // 可以接受, 但是考虑需求,对于a+b,不强制性括号
x = f ( a + b, c ); 
x = ( a == b ) ? a : ( a – b ); 
if ( a && b && c ) // 可以接受的
x = ( a + b )( c + d ); 
x = ( a * 3 ) + c + d; 
x = static_cast< uint16_t > ( a ) + b; // 不需要用来转换

  1. 编译器不执行开发人员所期望的操作:
    如果一种语言的特性没有完全定义,或者不明确,那么开发人员可以对构造的含义做一个假设,而编译器对它的解释可能完全不同。C语言++语言中有许多领域没有被完全定义,因此不同编译器的行为可能因人而异。在某些情况下,行为甚至在单个编译器中也会有所不同,这取决于上下文。ISO/IEC14882:2003[1]包含了许多可能以这种方式有所不同的问题。然而,它并没有像C标准在其“可移植性问题”附件中那样列出它们。(MISRA C++:2008的附录B详细了列出了C++漏洞)
    示例:
    规则 M4-5-3: (强制性,实施,自动化)类型(普通)char 和 wchar_t 的表达式不得用作除赋值运算符 =、相等运算符 == 和 ! 之外的内置运算符的操作数 = 和一元 & 运算符。
    根本原因:对字符数据的处理可能会产生与开发人员期望相反的结果。 例如,ISO/IEC 14882:2003 [1] §2.2(3) 仅要求数字“0”到“9”具有连续的数值。
    例外:在特殊情况下,如果遵守相关限制,则可以使用以下运算符:
    二进制 + 运算符可用于将 0 到 9 范围内的整数值添加到“0”;
    二元-运算符可用于减去字符“0”;
    关系运算符 <、<=、>、>= 可用于确定字符(或宽字符)是否表示数字
char_t ch = ‘t’; // 合规
uint8_t v;
if ( ( ch >= ‘a’ ) && ( ch <= ‘z’ ) ) // 不合规
{ 
}
if ( ( ch >=0) && ( ch <=9) ) // 符合例外  
{ 
 v = ch – ‘0; // 符合例外 
 v = ch – ‘1; // 不合规
}
else 
{ 
 // ... 
} 
ch =0+ v; // 符合例外 
ch = ‘A’ + v; // 不合规

  1. 编译器包含的错误:
    一个语言编译器(以及相关的链接器等)。它本身就是一个软件工具。编译器可能并不总是能正确地编译代码。例如,在某些情况下,它们可能不符合语言标准,或者它们可能只是包含“bug”。
    因为C语言++语言的某些方面很难理解,所以人们已经知道编译器编写者会误解该标准并错误地实现它。该语言的某些领域比其他领域更容易发生这种情况。此外,编译器的作者有时会有意识地选择改变标准。
    示例:
    规则 M1-0-2: (强制性,工具链,非自动化)仅当多个编译器具有通用的定义接口时,才应使用多个编译器。
    根本原因:多“编译器”(任何工具) 包括:
    混合语言、不同编译器、同一编译器的不同版本、同一编译器的不同配置。
    如果一个模块要用C++以外的语言实现,或者使用不同的编译器编译,需确保这个模块的正确集成。强制性考虑的问题包括:堆栈使用、参数传递、数据值的存储方式(长度、对齐、混叠、叠加等)。

  2. 运行时的错误:
    对于编译正确的代码,会出现一些不同的语言问题,但由于提供给它的特定数据,代码会在执行过程中导致错误。语言可以在可执行代码中构建运行时检查,以检测许多此类错误并采取适当的措施。 C++ 在提供运行时检查方面通常很差。这就是为什么由C++生成的代码往往很小且高效的原因之一,但在执行过程中检测错误时需要付出代价。C++编译器通常不为诸如算术异常(例如除以零)、溢出、指针地址的有效性或数组绑定错误等常见问题提供运行时检查。
    示例:
    规则 A18-0-2: (强制性,实施,自动化)应检查从字符串到数值的转换的错误状态。

std::uint16_t ReadFromStdin1() // 不合规
{ 
std::uint16_t a; 
std::cin >> a; // 没有检测到错误 
return a; 
}
std::uint16_t ReadFromStdin2() // 合规
{ 
std::uint16_t a; 
std::cin.clear(); // 清除所有标志位
std::cin >> a; 
if (std::cin.fail()) 
{ 
throw std::runtime_error{"unable to read an integer"}; 
} 
std::cin.clear(); // 为后续操作清除所有标志位
return a; 
} 

三 总结

C++以其极高的编程效率在嵌入式系统开发中大放异彩,汽车嵌入式软件开发出高效安全的软件,需要严格的规范来对原生的C++标准进行约束。关注AUTOSAR C++的规则更新是智能汽车软件开发人员工程软件开发技能成熟的标志。文章来源地址https://www.toymoban.com/news/detail-441372.html

到了这里,关于第七十七篇:车辆安全-车载软件C++语言开发指南(AUTOSAR C++)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 软考高级系统架构设计师系列论文七十七:论软件产品线技术

    本人在测井行业的一个国有企业软件开发部工作,从2021年初开始,我陆续参加了多个测井软件开发项目,这些项目都是测井行业资料处理解释软件,具有很强的行业特征,其开发方向和应用范围都非常相似,从“测井资料处理集成软件”项目,开始我实施了软件产品线技术,

    2024年02月11日
    浏览(83)
  • C++之std::pair<uint64_t, size_t>应用实例(一百七十七)

    简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏: Audio工程师进阶系列 【 原创干货持续更新中…… 】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:An

    2024年02月12日
    浏览(65)
  • Vue基础第七篇

    在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信。 多个组件需要共享数据时  3.搭建vuex环境 创建文件: src/store/index.js 在 main.js 中创建vm时传入 store 配置

    2024年02月08日
    浏览(101)
  • OpenCV第七篇:车牌识别

    目录 1.调整图片大小,并获取灰度图  2.双边滤波去除噪音:cv2.bilateralFilter()。 3.边缘检测:cv2.Canny(image,threshold1,threshold2) 4.寻找轮廓:车牌(四边形) ​编辑 5.图像位运算进行遮罩 6.图像剪裁 7.字符识别:OCR 1.调整图片大小,并获取灰度图  2.双边滤波去除噪音:cv

    2024年02月06日
    浏览(51)
  • 网络基础(第七篇)静态路由配置

    三台PC机、三台路由器 配置静态路由: 第一步,Ensp上写好PC机的IP地址和子网掩码、每一个接口的网关和网段,如图(绿色):  第二步,配置三台PC机的IP地址、子网掩码、网关。      第三步,配置所有接口的网关: 第四步,完成所有接口配置后,开始配静态路由,这里

    2024年02月10日
    浏览(45)
  • 微服务开发系列 第七篇:RocketMQ

    A、技术栈 开发语言:Java 1.8 数据库:MySQL、Redis、MongoDB、Elasticsearch 微服务框架:Spring Cloud Alibaba 微服务网关:Spring Cloud Gateway 服务注册和配置中心:Nacos 分布式事务:Seata 链路追踪框架:Sleuth 服务降级与熔断:Sentinel ORM框架:MyBatis-Plus 分布式任务调度平台:XXL-JOB 消息中间

    2024年02月07日
    浏览(41)
  • Java学习手册——第七篇基础语法

    本篇为大家快速入门Java基础语法,了解一个语言的基础语法是必要的, 因为我们后期都是需要用这些基础语法汇聚成我们想要的功能和想法。 这些都是必知必会的,但是不需要十分掌握,需要用到时可知道哪里查询, 用多了就熟练了。 注释有:文档注释、多行注释、当行

    2024年02月20日
    浏览(44)
  • 容器(第七篇)docker-consul

    consul服务器: 1. 建立 Consul 服务 mkdir /opt/consul cp consul_0.9.2_linux_amd64.zip /opt/consul cd /opt/consul unzip consul_0.9.2_linux_amd64.zip mv consul /usr/local/bin/ //设置代理,在后台启动 consul 服务端 consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=192.168.80.15 -client=0.0.0.0 -node=consul

    2024年02月08日
    浏览(61)
  • 【Linux篇】第十七篇——信号量

    前言 POSIX信号量 信号量的概念 信号量的工作原理 信号量函数 二元信号量模拟实现互斥功能 基于环形队列的生产消费模型 空间资源和数据资源 生产者和消费者申请和释放资源 必须遵守的两个规则 代码实现 信号量保护环形队列的原理 将可能被多个执行流同时访问的资源叫

    2024年02月06日
    浏览(46)
  • 第二百七十七回

    我们在上一章回中介绍了\\\"DropdownMenu组件\\\"相关的内容,本章回中将介绍DropdownButton组件.闲话休提,让我们一起Talk Flutter吧。 我们在本章回中介绍的DropdownButton组件和上一章回中介绍的DropdownMenu组件类似,主要用来实现下拉菜单,不过该组件在外观上像一个带图标的按钮, 点击

    2024年01月21日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包