CodeQL 文档

空格与运算符优先级相矛盾

ID: go/whitespace-contradicts-precedence
Kind: problem
Security severity: 
Severity: warning
Precision: very-high
Tags:
   - maintainability
   - correctness
   - external/cwe/cwe-783
Query suites:
   - go-security-and-quality.qls

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

如果嵌套表达式中运算符周围的空格暗示的分组与 Go 运算符优先级规则强制执行的分组不同,则会出现问题:它们可能表明代码作者误解了优先级规则。即使没有错误,空格也可能会让阅读代码的人感到困惑。

建议

确保运算符周围的空格反映运算符优先级,或者使用括号来阐明分组。

示例

考虑以下用于检查变量“x”的“pos”位置处的位是否已设置的函数

package main

func isBitSetBad(x int, pos uint) bool {
	return x&1<<pos != 0
}

此处,&<< 周围的空格建议分组为 x & (1<<pos)。但是,在 Go 中,&<< 具有相同的优先级,因此从左到右计算,因此该表达式实际上等效于 (x & 1) << pos

要解决此问题并赋予表达式其预期语义,应按如下所示使用括号

package main

func isBitSetGood(x int, pos uint) bool {
	return x&(1<<pos) != 0
}

参考

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