功能 #3354
由 稚媛 黄 更新于 3 个月 之前
1、C语言:必须符合签署供应商合作协议(SOBA)时最新的MISRA C编码标准,包括所有规则、指令和修正。
2、C++语言:必须符合签署SOBA时最新的AUTOSAR C++编码标准,包括所有规则、指令和修正。(注:AUTOSAR C++ 14直接替代了MISRA C++ 2008标准。)
3、C/C++语言:必须符合福特编码标准。
1)对于未命名的数值常数,避免使用未命名的数字常量,优先使用有意义的命名常量。
可以接受的用法:当定义和可用时,使用True和False,而不是文字1和0。
不可接受的用法:不建议将字符串文字作为代码的一部分。
2)针对于包含文件,避免多重声明,避免别名和悬空引用。
可接受的使用:防止在单个编译单元中多次处理同一个头文件,例如,使用#ifndef、#define和#endif来保护头文件,条件编译会增加调试和管理不同代码变体的难度,在生成代码变体时,优先在构建级别包含或排除文件,而不是在源文件中使用条件编译。
不推荐的使用:不要#include一个.c文件,不要在头文件中放置可执行代码。
3)当多个任务同时访问一个资源时,资源或其提供的数据可能会被破坏。
例如,一个任务在读取NVM(非易失性存储器)之前,必须等待所有其他NVM访问完成。
并发和共享资源问题是导致保修问题的主要原因之一,仅次于“编程疏忽”。
共享资源的示例:
MCU内部的资源(如变量、NVM、寄存器、硬件I/O等),由单核上的多个任务访问,单核上的任务和ISR(中断服务例程)访问的内部资源,多核上的任务和/或ISR访问的内部资源,多个ECU访问的外部资源。
资源保护的示例:
互斥锁和信号量,获取操作系统的“资源”,任务间变量,独占区域
可接受的使用:
保护共享资源:
任何共享变量、寄存器、I/O电路或辅助函数都应通过管理器、操作系统资源(如信号量)或任务间变量进行保护。
ISR中的资源保护:
所有在ISR内部访问的资源都应受到保护,因为上下文增加了资源安全使用的复杂性。
外部设备的保护:
所有与微控制器共享连接的外部设备都应受到保护。
确保这些外部设备遵循HSIS(硬件软件接口规范)中规定的限制、建议和访问控制。
不推荐的使用:
不要创建自己的管理器来保护共享资源,除非操作系统或开发框架未提供保护机制。
4)对于值比较的情况
以下情况不需要使用不等式:
变量声明为整数但用作枚举。
测试整数是否等于位表示的最小值或最大值。
测试整数是否为零。
switch语句中的default情况可以处理所有超出范围的条件。
不推荐的使用:
避免隐式比较:
例如:if (take_branch),应明确写出条件,如 if (take_branch == true)。
避免使用“双重否定”进行比较:
例如:if (NOT_DISABLED != false),应直接写成 if (NOT_DISABLED)。
类似地,#if (NOT_DISABLED != 0) 应简化为 #if (NOT_DISABLED)。避免使用浮点值作为循环终止条件或循环索引:
浮点值的精度问题可能导致不可预测的行为。
5)使用条件语句时,最好使用简单、易于理解的表达方式,保证每行一个语句
不推荐使用复合语句,避免在测试中产生副作用,在if()或while()语句中避免嵌入赋值或其他可能产生副作用的操作
6) 模块的设计意图行为需要在系统和ECU级别明确定义。ECU还需要一种机制来防止代码或硬件的未定义行为。
可接受的使用:
处理“除以零”问题:
检测并返回错误代码给调用函数。
检测并提供默认的分母以避免错误。
调用函数在收到此类错误代码时,可以执行备用行为。
使用运行时分析工具:
检测缓冲区溢出或下溢、内存泄漏、通过过期指针访问“僵尸”内存区域等问题。
例如:使用Valgrind、Polyspace Code Prover等工具。
确保设计文档准确描述所有公共和全局成员及函数参数:
确保使用符合设计意图。
正确管理共享数据:
当数据在多个任务之间或任务与ISR之间共享时,确保数据的正确管理。
不推荐的使用:
避免在应用代码中使用#pragma:
#pragma通常与编译器相关,可能降低代码的可移植性。
如果必须使用#pragma:在项目的软件开发计划中记录使用条件,通过审查或工具确认其合规性。
7)在开发周期中,应审查并采用这些规则。静态分析工具无法覆盖所有未定义行为,因此项目负责人需要手动审查附录H中无法静态检查的规则:
可接受的使用:
启用所有编译器警告:
在构建过程中启用所有编译器警告,以捕捉潜在问题。
使用足够的括号:
使用括号明确计算顺序,提高代码可读性。
汇编代码注释:
在使用汇编代码时,确保为每条汇编指令提供足够的注释。
内存处理函数的使用规则:
目标缓冲区必须至少与size/count参数一样大。
所有缓冲区参数必须为非NULL。
对于memmove和memcpy:
源缓冲区必须至少与size/count参数一样大。
源缓冲区和目标缓冲区不能重叠。
使用静态分析工具:
在项目级别始终使用静态分析工具,并修复发现的问题。
不推荐的使用:
不要使用系统默认值:
例如,堆栈、堆栈大小、MCU寄存器等的值不应使用系统默认值,而应显式配置
4、提供经批准的工具进行静态分析、复杂度指标收集和MISRA-C/AUTOSAR C++合规性检查
返回