25
社区成员
发帖
与我相关
我的任务
分享根据市场监管总局关于2021年全国汽车和消费品召回情况的通告内容,我们可以得知:2021年,我国共实施汽车召回232次,涉及车辆873.6万辆,分别比上年增长16.6%和28.8%。


图1 全国汽车和消费品召回情况
软件缺陷引起汽车召回事件逐年增多,其中多个软件缺陷导致了撞车事故甚至人员伤亡,如通用汽车因动力转向问题召回超过100万辆皮卡和SUV和菲亚特克莱斯勒因巡航控制缺陷召回530万辆汽车等实例都是因为软件缺陷影响了汽车的安全。
软件在汽车中不断扮演更重要的角色,预计2030年每量汽车将运行约3亿行代码,超过90%的汽车创新将来源于软件。因此,软件的质量尤为重要。

图2 软件体量逐年递增
软件测试手段有代码审查、静态分析、单元测试、集成测试、验收测试等,从图3我们不难看出随着缺陷发现阶段的后移,修复缺陷的代价是指数级增长的,因此静态分析测试阶段尤为重要。

图3 缺陷发现阶段与修复代价关系图

图4 软件研制各阶段缺陷产生和修复情况
如图4所示,软件研制过程中,绝大多数的缺陷由软件编码阶段产生,并且超过一半的缺陷会被遗漏到测试阶段。

图5 ISO 26262中对软件产品研制的标准要求
ISO 26262标准在Part 6:Product development at the software level中对软件研制的需求、设计、开发各个环节进行了测试、验证的约束。


图6 软件研发各环节的测试验证约束示意图



6-5 Table 1 - Topics to be covered by modelling and coding guidelines

建模和编码规范应该包含:
1a. 降低复杂度
1b. 使用语言子集
具体包含:
如:C++标准明确规定的废弃的用法
如:局部变量与全局变量同名
如:静态全局变量的构造函数可以抛出异常
1c. 使用强类型
C/C++语言提供的类型系统为编程提供了很多便利,但其类型系统(如:类型提升、类型转换等机制)以及不同平台字长不同的特性可能导致隐藏的程序问题。
例如:
在lp64类型的机器上,a会隐式转换为unsinged int类型,导致函数返回true,与-1<1的直观理解不符:
bool fun() {
long a = -1;
unsigned b = 1;
return a > b;
}
1d. 使用防御性的实现
添加具有防御性代码,预防问题发生,如:
1e. 使用 well-trusted 设计原则
1f. 使用明确的图形表示(建模)
1g. 使用编码样式指南
1h. 使用命名规范
1i. 并发

软件架构设计的原则:
1a. 恰当的组件层次层次结构
1b. 限制软件组件的大小和复杂度
1c. 限制接口的数量
1d. 组件内部高内聚
1e. 组件间松耦合
1f. 合适的调度属性
1g. 限制中断的使用
1h. 软件组件间合理的空间隔离
1i. 共享资源的恰当管理

软件单元的设计和实现准则:
1a. 子程序和函数只有单一的入口和退出点
1b. 不应使用未在创建时在线检测合法性的动态对象
1c. 初始化全部变量
1d. 避免使用全局变量,除非可以证明使用的合理性
全局变量会带来以下问题:
全局变量的使用会破坏信息隐藏原则,违背ISO2626-6 Table6 1h中要求的“没有隐藏的数据流和控制流”。
全局变量会导致模块之间的强耦合。违背ISO2626-6 Table3 1e要求的“组件之间要降低耦合”。
C++中全局变量的初始化等操作可能导致程序出现未处理的异常。
但是,C/C++完全禁止使用全局变量几乎是不可能的,因此在使用全局变量时就要着重考虑:能否已经尽可能避免使用全局变量、能否已经尽可能限制全局变量可见性、全局变量构造函数是否安全。
例如:
AUTOSAR CPP114编程指导中有一条规则“Rule A3-3-2 Static and thread-local objects shall be constant-initialized”,就要求全局变量、静态成员变量等必须是常量初始化的,以避免全局变量提升组件之间的耦合度。
1f. 限制使用指针
1g. 禁止使用隐式类型转换
1h. 不应出现隐藏的数据流和控制流
1i. 禁止使用无条件跳转
1j. 禁止使用递归
MISRA(The Motor Industry Software Reliability Association 汽车工业软件可靠性联会)是位于英国的一个跨国汽车工业协会,其出版的MISRA C:2012编程规范正广泛应用于以C语言编写的汽车软件的功能安全认证。



对于ASIL D级的软件强烈建议按照11.4.9章节要求的使用验证工具,具体要求为:
欢迎访问产品网站:北京轩宇信息技术有限公司--高可信工具软件