CXX.INT_TO_FLOAT.CONV

在算术运算中使用隐式转换

如果代码尝试将整数隐式转换为浮点格式以进行浮点运算,此检查器就会报告缺陷。

漏洞与风险

使用整数算术来计算对浮点变量的赋值,可能会导致信息丢失。

缓解与预防

通过将表达式中的一个整数转换为浮点类型,可以避免此问题。

漏洞代码示例 1

复制
  void func(void) {
  short a = 533;
  int b = 6789;
  long c = 466438237;
  float d = a / 7; /* d is 76.0 */
  double e = b / 30; /* e is 226.0 */
  double f = c * 789; /* f may be negative due to overflow */
  }

在此不符合要求的代码示例中,对整数进行除法和乘法运算,然后将结果转换为浮点值。因此,浮点变量 d、e 和 f 未正确初始化,因为运算在值转换为浮点值之前进行。结果会截断为最接近的整数或者可能溢出。

Klocwork 在第 5、6 和 7 行报告了 CXX.INT_TO_FLOAT.CONV 缺陷,这表示:“整数类型转换为浮点类型可能会导致信息丢失”。

修正代码示例 1

复制
  void func(void) {
  short a = 533;
 int b = 6789;
  long c = 466438237;
  float d = a / 7.0f; /* d is 76.0 */
  double e = b / 30.0; /* e is 226.0 */
  double f = (double)c * 789; /* f may be negative due to overflow */
  }

在修正代码示例中,Klocwork 不再报告缺陷,因为通过确保除法运算的至少一个操作数为浮点数,可消除初始化中的小数错误。

漏洞代码示例 2

复制
  void func(void) {
  short a = 533;
  
  float d;
  d = a / 7; /* d is 76.0 */
  }

在此示例中,对整数进行除法运算,然后将结果转换为浮点值。因此,浮点变量 d 未正确初始化,因为运算在值转换为浮点值之前进行。

Klocwork 在第 5 行报告了 CXX.INT_TO_FLOAT.CONV 缺陷,这表示“整数类型转换为浮点类型可能会导致信息丢失”。

修正代码示例 2

复制
  void func(void) {
  short a = 533;
  
  float d = a;
  
  d /= 7; /* d is 76.14286 */
  }

在此示例中,Klocwork 不再报告缺陷,因为通过首先在浮点变量中存储整数,然后执行算术运算,可消除初始化中的小数错误。此做法可确保至少一个操作数为浮点数,并且随后对浮点操作数执行算术运算。