避免数据丢失造成类型转换失效
12.2 ID_invalidPromotion
下列表达式的类型不应被隐式或显式地转为取值范围更大的类型:
- 二元算术表达式
- 以二元算术表达式为分枝的三元表达式
这种表达式的溢出或精度损失会发生在类型转换之前,使类型转换失效。
示例:
void foo(int32_t a, int32_t b)
{
int64_t i = a * b; // Non-compliant
int64_t j = int64_t(a + b); // Non-compliant
double x = a / b; // Non-compliant
double y = double(a / b); // Non-compliant
....
}
例中表达式 a * b、a + b 的类型为 32 位整型,如果溢出则无法正确转为 64 位整型;a / b 的结果仍是整数,小数部分将丢失。
应将操作数转为目标类型,使算术表达式与被赋值的对象具有相同的类型:
void foo(int32_t a, int32_t b)
{
int64_t i = int64_t(a) * b; // Compliant
int64_t j = a + int64_t(b); // Compliant
double x = double(a) / b; // Compliant
double y = a / double(b); // Compliant
....
}
这样便可避免类型转换失效。
相关
参考
MISRA C 2012 10.6
MISRA C 2012 10.7
MISRA C 2012 10.8
MISRA C++ 2008 5-0-3
MISRA C++ 2008 5-0-7
MISRA C++ 2008 5-0-8