为了账号安全,请及时绑定邮箱和手机立即绑定

go vet:捕获内部竞争条件,但不捕获外部竞争条件

go vet:捕获内部竞争条件,但不捕获外部竞争条件

Go
慕侠2389804 2023-07-31 15:50:00
在最近使用了导致数据争用的嵌套循环。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循环中的最后一条语句。

该测试非常简单,可能会检测到大多数错误实例。检测错误的其他实例需要一种需要更多时间来开发和执行的方法。


查看完整回答
反对 回复 2023-07-31
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

具体来说这个评论:

...这个问题分析起来更具挑战性,因为它需要证明该函数不是在循环内调用的,或者至少无法证明它是在循环内调用的。一旦匿名函数被存储在数据结构中或传递给另一个函数,vet 就无法再精确地确定何时可能调用它。

换句话说,我认为当前的兽医检查可能与我们在没有过程间分析的情况下所能做的一样好。


查看完整回答
反对 回复 2023-07-31
  • 2 回答
  • 0 关注
  • 118 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信