CodeQL 文档

避免在 for 循环中使用浮点数

ID: cpp/loop-variable-float
Kind: problem
Security severity: 
Severity: recommendation
Precision: high
Tags:
   - correctness
   - reliability
   - external/jsf
Query suites:
   - cpp-security-and-quality.qls

单击查看 CodeQL 存储库中的查询

此规则查找将 float 变量用作循环计数器的情况。 float 值容易出现舍入和截断问题。 尤其是,非常大或非常小的浮点数容易出现舍入误差,从而导致循环行为异常。

建议

使用整型变量代替浮点数作为循环计数器。

示例

void f() {
	float i = 0.0f;
	//wrong: float used as loop counter
	for (i = 0; i < 1000000.0f; i++) { //may execute 1000000 +x/-x times
		//...
	}
	for (i = 0; i < 100000000.0f; i++) { //may never terminate, as rounding errors 
	                                     //cancel out the addition of 1.0 once 
	                                     //i becomes large enough
		//...
	}
}

参考资料

  • AV 规则 197,联合攻击战斗机空中飞行器 C++ 编码标准。洛克希德·马丁公司,2005 年。

  • MISRA C++ 规则 6-5-1,关键系统中使用 C++ 语言的指南。汽车行业软件可靠性协会,2008 年。

  • FLP30-C。不要将浮点变量用作循环计数器

  • ©GitHub, Inc.
  • 条款
  • 隐私