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