目录
相关文章如下:
10、《MISRA C-2012准则之表达式》
11、《MISRA C-2012准则之副作用》
一.MISRA C简介
MISRA C是由汽车产业软件可靠性协会(MISRA)提出的C语言开发标准。其目的是在增进嵌入式系统的安全性及可移植性。
MISRA C一开始主要是针对汽车产业,不过其它产业也逐渐开始使用MISRA C:包括航天、电信、 国防、医疗设备、铁路等领域中都已有厂商使用MISRA C。
MISRA C的第一版是在1998年发行,一般称为MISRA-C:1998。在2004年时发行了第二版的MISRA C,称作MISRA-C:2004。2012年发布第三版,为当前最新有效的C语言规范版本,称为MISRA-C:2012。 MISRA C不能100%保证程序不出问题,但是能尽可能的预防,总结一下,基本上使用MISRA C具有以下五个维度的优势:
1、提升可靠性
2、提升可读性
3、提升可移植性
4、提升可维护性
5、提升安全性
二、副作用
必需。初始化列表不应包含持续副作用。
必需。表达式的值和他的持续副作用应在允许的计算顺序下保持相同。
建议。包含自增或自减的完整表达式应无其他除自增自减外的潜在副作用。
建议。不应使用赋值运算的结果。
必需。逻辑与和逻辑或的右手操作数不应包含持续副作用。
强制。sizeof运算符的操作数不应包含任何有潜在副作用的表达式。
错误示例 1:初始化列表包含持续副作用
int i = 0;
int arr[] = {i++, i++}; // 错误:初始化列表中包含自增(副作用),行为未定义
错误示例 2:表达式副作用顺序不一致
int a = 0;
int b = a++, a++; // 错误:a 和 a 的副作用顺序未定义,可能导致结果不确定
错误示例 3:自增/自减表达式包含其他副作用
int x = 5;
int y = (x++, x = 10); // 错误:自增表达式包含赋值(潜在副作用),建议分开写
错误示例 4:逻辑运算符包含持续副作用
int flag = 1;
int count = 0;
if (flag && (count++, flag)) // 错误:逻辑与的右手操作数包含副作用(count++),应避免
错误示例 5:sizeof包含副作用表达式
int i = 0;
int size = sizeof(i++); // 错误:sizeof的操作数包含自增(副作用),应避免
错误示例 6:使用赋值运算的结果
int a = 0, b = 0;
if ((a = 1) && (b = 2)) // 错误:使用赋值运算的结果(a = 1 和 b = 2),应避免
三、注意事项
- 初始化列表应避免自增、自减、函数调用等可能产生副作用的操作。
- 表达式中的副作用(如自增、赋值)应确保在所有可能的计算顺序下结果一致。
- 逻辑与(&&)和逻辑或(||)的短路特性可能导致副作用只部分执行,应避免。
- sizeof运算符要求操作数是纯表达式(无副作用),如变量或常量。
- 赋值运算的结果(如
a = b
)不应直接用于条件判断或复合表达式,除非明确需要其值。