赞
踩
C++是面向对象的编程,比C语言更加复杂,抽象程度高,但C++在一些图像处理、系统、控件的编程方面,实用性更强,具有自己的编程优势。在车载嵌入式系统的开发中,C和C++都具有重要的作用。C++语言所使用的面向对象的编程技术如封装、继承和多态性极大的提高了在大规模嵌入式编程应用中代码的可读性、可重用性和可移植性。C++在嵌入式系统中广泛使用的主要原因包括:
因此,在辅助驾驶、无人驾驶等软件系统的开发中,C++被广泛的应用。针对C++在汽车工业领域的安全规范也逐渐完善。AUTOSAR C++是ISO/IEC 14882标准在汽车工业子领域的应用规范。
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的演变为:
除此之外,AUTOSAR在MISRA C++:2008基础之上指定了:
与MISRA-C一样,AUTOSAR C++的规范中的规则根据义务等级进行规则划分为:必需(强制性)、建议性。根据静态分析执行规则可以划分为:自动化、部分自动化、非自动化。绝大多数的规则都是能够通过静态分析自动强制执行。除此之外,这些规则还可以根据被分配的目标分类为:实施(代码、软件设计、架构)、验证(代码审查、分析、测试)、工具链(预处理器、编译器、链接器、编译器库)、基础设施(运行系统、硬件)。
C++语言的不安全性主要来源有:开发者犯错、开发者对C++的误解、编译器不执行开发人员所期望的操作、编译器包含错误、运行是的错误。
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 ( ) ) // 合规 { }
//何时强制性括号 赋值运算符的右侧操作数不强制性括号,除非右侧本身包含赋值表达式: 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; // 不需要用来转换
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; // 不合规
编译器包含的错误:
一个语言编译器(以及相关的链接器等)。它本身就是一个软件工具。编译器可能并不总是能正确地编译代码。例如,在某些情况下,它们可能不符合语言标准,或者它们可能只是包含“bug”。
因为C语言++语言的某些方面很难理解,所以人们已经知道编译器编写者会误解该标准并错误地实现它。该语言的某些领域比其他领域更容易发生这种情况。此外,编译器的作者有时会有意识地选择改变标准。
示例:
规则 M1-0-2: (强制性,工具链,非自动化)仅当多个编译器具有通用的定义接口时,才应使用多个编译器。
根本原因:多“编译器”(任何工具) 包括:
混合语言、不同编译器、同一编译器的不同版本、同一编译器的不同配置。
如果一个模块要用C++以外的语言实现,或者使用不同的编译器编译,需确保这个模块的正确集成。强制性考虑的问题包括:堆栈使用、参数传递、数据值的存储方式(长度、对齐、混叠、叠加等)。
运行时的错误:
对于编译正确的代码,会出现一些不同的语言问题,但由于提供给它的特定数据,代码会在执行过程中导致错误。语言可以在可执行代码中构建运行时检查,以检测许多此类错误并采取适当的措施。 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++的规则更新是智能汽车软件开发人员工程软件开发技能成熟的标志。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。