CodeQL 文档

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

点击查看 CodeQL 代码库中的查询

大多数 for 循环要么递增一个变量直到达到上限,要么递减一个变量直到达到下限。如果相反,变量递增但与下限比较,或者递减但与上限比较,则循环通常会立即终止并且永远不会执行其主体,或者会无限期地迭代。这两种情况都不是故意的,很可能是由于拼写错误造成的。

唯一的例外是循环变量是无符号整数的循环。在这种情况下,使用上限初始化变量,然后在与同一上限进行比较时递减变量是没有问题的:变量从上限递减到零,然后回绕到一个大的正值,导致循环终止。这通常是故意的,因此查询不会标记它。

建议

仔细检查循环,以检查其测试表达式或更新语句是否有误。

示例

在以下示例中,使用两个循环将切片 a 中范围 lower..upper 之外的所有元素设置为零。但是,第二个循环包含一个拼写错误:循环变量 i 被递减而不是递增,因此 iupper+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
	}
}

参考

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