`govet`捕获内部竞争条件,但没有外部竞争条件

问题描述 投票:0回答:1

recent question中,使用了导致数据争用的嵌套循环。 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
                wg.Done()
            }()
        }
    }

Playground

[go vet正确地检测到内部竞争条件,但不能正确检测到外部竞争条件。

为什么?太复杂以至于无法跟踪超过2个级别的范围?

go race-condition static-analysis
1个回答
1
投票

[评论in the code说:

此分析器从一个内部检查是否引用了循环变量循环体内的函数文字。它只检查实例函数文字是在defer或go语句中调用的,即循环主体中的最后一条语句,否则我们将需要整个程序分析。

go vet命令不会抱怨o,因为go语句不是o循环中的最后一条语句。

© www.soinside.com 2019 - 2024. All rights reserved.