☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

避免数据丢失造成类型转换失效

12.2 ID_invalidPromotion
目录 › next › previous

下列表达式的类型不应被隐式或显式地转为取值范围更大的类型:

  • 二元算术表达式
  • 以二元算术表达式为分枝的三元表达式

这种表达式的溢出或精度损失会发生在类型转换之前,使类型转换失效。

示例:

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
    ....
}

这样便可避免类型转换失效。

相关

ID_evalOverflow

参考

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
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.