For 循环方向不一致¶
ID: go/inconsistent-loop-direction
Kind: problem
Security severity:
Severity: error
Precision: very-high
Tags:
- correctness
- external/cwe/cwe-835
Query suites:
- go-security-and-quality.qls
大多数 for
循环要么递增一个变量直到达到上限,要么递减一个变量直到达到下限。如果相反,变量递增但与下限比较,或者递减但与上限比较,则循环通常会立即终止并且永远不会执行其主体,或者会无限期地迭代。这两种情况都不是故意的,很可能是由于拼写错误造成的。
唯一的例外是循环变量是无符号整数的循环。在这种情况下,使用上限初始化变量,然后在与同一上限进行比较时递减变量是没有问题的:变量从上限递减到零,然后回绕到一个大的正值,导致循环终止。这通常是故意的,因此查询不会标记它。
建议¶
仔细检查循环,以检查其测试表达式或更新语句是否有误。
示例¶
在以下示例中,使用两个循环将切片 a
中范围 lower
..upper
之外的所有元素设置为零。但是,第二个循环包含一个拼写错误:循环变量 i
被递减而不是递增,因此 i
从 upper+1
向下计数到 0
、-1
、-2
,依此类推。
package main
func zeroOutExcept(a []int, lower int, upper int) {
// zero out everything below index `lower`
for i := lower - 1; i >= 0; i-- {
a[i] = 0
}
// zero out everything above index `upper`
for i := upper + 1; i < len(a); i-- {
a[i] = 0
}
}
要解决此问题,请更改第二个循环以递增其循环变量,而不是递减它
package main
func zeroOutExcept(a []int, lower int, upper int) {
// zero out everything below index `lower`
for i := lower - 1; i >= 0; i-- {
a[i] = 0
}
// zero out everything above index `upper`
for i := upper + 1; i < len(a); i++ {
a[i] = 0
}
}