在最近使用了导致数据争用的嵌套循环。go vet只发现了一些问题。使用简化版本:for _, o := range ol { o := o // <- remove this: `go vet` does *NOT* complain for _, d := range dl { d := d // <- remove this: `go vet` will complain go func() { fmt.Printf("%03d %03d\n", o, d) // potential data-race }() } }操场go vet正确检测内部竞争条件,但不能正确检测外部竞争条件。为什么是这样?太复杂而无法跟踪超过 2 层的范围?
2 回答
慕姐4208626
TA贡献1852条经验 获得超7个赞
代码中的注释说:
该分析器检查循环体内函数文字中对循环变量的引用。它仅检查在 defer 或 go 语句(循环体中的最后一个语句)中调用函数文字的实例,否则我们将需要整个程序分析。
该go vet
命令不会抱怨,o
因为 go 语句不是o
循环中的最后一条语句。
该测试非常简单,可能会检测到大多数错误实例。检测错误的其他实例需要一种需要更多时间来开发和执行的方法。
慕田峪7331174
TA贡献1828条经验 获得超13个赞
具体来说这个评论:
...这个问题分析起来更具挑战性,因为它需要证明该函数不是在循环内调用的,或者至少无法证明它是在循环内调用的。一旦匿名函数被存储在数据结构中或传递给另一个函数,vet 就无法再精确地确定何时可能调用它。
换句话说,我认为当前的兽医检查可能与我们在没有过程间分析的情况下所能做的一样好。
- 2 回答
- 0 关注
- 118 浏览
添加回答
举报
0/150
提交
取消