项目

一般

简介

功能 #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++合规性检查

返回