阅读以下关于安全攸关嵌入式系统相关技术的描述,在答题纸上回答问题1至问题3。
某公司机电管理系列产品被广泛应用于飞行器后,外场事故频繁发生,轻则飞机座舱显示机电设备工作异常,重则系统预警,切入备份运行。这些事故给航空公司带来重大经济损失。
公司领导非常重视航空公司的问题反馈,责令公司王总带队到现场进行故障排查。经过一个多月的排查,故障现象始终未复现,同时,公司实验室内也在反复复现故障,结果未取得显著成效,但发现产品存在偶然丢失协议包的现象。随后,公司领导组织行业专家召开故障分析会。王总在会上对前期故障排查情况进行了说明,指出从外场现象看CCDL协议包丢失是引起系统报警、切换的主要原因。图3-1给出了机电管理产品的工作原理,机电管理系统主要承担了对飞行器的刹车、燃油和环控等子系统进行监视与控制,它对飞行器而言是安全攸关系统,因此,从系统结构上采用了双余度计算机系统。具体工作流程简要说明如下:
1.机电管理系统由1号计算机和2号计算机组成,双机互为余度备份;
2.双机中分别驻留了一个100ms周期的CCDL任务,完成双机间的交叉对比和实时监控等工作。10ms定时器作为任务的工作频率;
3.交叉对比协议包包含一组"AA55"报头、消息长度、数据和校验码;
4.2号机将协议包通过422总线发送给1号机(422总线接口芯片有8级缓冲);
5.1号机通过中断方式将422总线数据接收到大环形缓冲区中(大小为4096B);
6.100ms的CCDL定时任务将大环形缓冲区的数据以512B为单位拷贝到小环形缓冲区中(大小512B);
7.CCDL任务按照协议包格式解析小环形缓冲的数据,如果校验错误,丢弃当前协议包;
8.在协议包格式正确的情况下,进行数据交叉比对,比对正确则输出;比对不正确,并连续不正确超过门限,则报警。
王总汇报时指出,在设计安全攸关系统软件时,往往不重视安全攸关软件设计方法, 不遵守C语言安全编码规范,导致程序质量较差,代码中存在支全隐患。请简要说明表 3-1给出的C语言代码是C语言安全编码标准中(如:MISARC标准)不允许采用的代码 结构的原因。


1) 不允许。违背(建议)规则6.3。
2) 不允许。 违背(建议)规则6.3、(强制)规则15.3和(强制)规则15.5。
3) 不允许。违背(建议)规则6.3。
4) 不允许。违背(建议)规则6.3 和强制规则8.1。
5) 不允许。违背(建议)规则6.3和强制规则12.2. x=exp_1(&y)+exp_2(&)应修改为:x=exp_1(&y);x+=exp_2(&y)。
6) 不允许。违背(建议)规则6.3 和强制规则10.3;(unsigned int *)s是危险的类型转换。
1)不允许:违背(建议)规则6.3。MISAR-C标准要求开发人员显式标识数据类型的长度和符号特性,避免直接使用标准数据类型。如果没有使用typedef来标识数据类型的长度和符号特性,在不同平台上可能会导致类型不一致,增加系统不稳定的风险。比如在不同系统上,int类型的大小可能不同,因此建议使用typedef定义类型,如typedef unsigned int uint32_t;,确保数据类型的一致性和可移植性。
2)不允许:违背(建议)规则6.3、(强制)规则15.3和(强制)规则15.5。在使用switch语句时,MISAR-C标准强制要求switch语句必须包含default子句,并且至少有一个case子句。缺少default子句会使得程序在没有匹配任何case时不做任何处理,这会导致未处理的情况或未定义行为。确保switch语句包含default子句可以增强程序的健壮性。
3)不允许:违背(建议)规则6.3。使用标准数据类型而没有显式定义数据类型的符号和长度特性,会增加程序出现错误的风险,尤其是在跨平台或者不同编译器的环境下。因此,标准建议使用typedef明确标识数据类型,减少出现不同数据类型大小或符号特性的潜在问题。
4)不允许:违背(建议)规则6.3 和强制规则8.1。MISAR-C标准要求所有函数必须有原型声明,并且函数原型必须在函数定义和调用范围内都是可见的。没有函数原型声明或者函数原型不可见,会导致编译器在函数调用时无法进行类型检查,容易导致运行时错误或行为不确定。
5)不允许:违背(建议)规则6.3和强制规则12.2。MISAR-C标准要求程序中的表达式在标准允许的任何次序下应该产生相同的结果。代码中如果依赖于特定的计算顺序,可能导致在不同编译器或不同平台上行为不一致,从而产生潜在的错误。为了保证一致性和可维护性,应避免在表达式中依赖计算顺序。
6)不允许:违背(建议)规则6.3和强制规则10.3。MISAR-C标准中强制要求避免危险的类型转换。代码中的类型转换(unsigned int *)s是不安全的,可能导致内存访问错误或未定义行为,尤其是在不同平台或编译器上,指针类型转换可能导致错误的内存地址访问,增加了程序崩溃或错误的风险。