在最近使用了導致數據爭用的嵌套循環。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 關注
- 151 瀏覽
添加回答
舉報
0/150
提交
取消