在最近使用了導(dǎo)致數(shù)據(jù)爭用的嵌套循環(huán)。go vet只發(fā)現(xiàn)了一些問題。使用簡化版本: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正確檢測內(nèi)部競爭條件,但不能正確檢測外部競爭條件。為什么是這樣?太復(fù)雜而無法跟蹤超過 2 層的范圍?
2 回答

慕姐4208626
TA貢獻1852條經(jīng)驗 獲得超7個贊
代碼中的注釋說:
該分析器檢查循環(huán)體內(nèi)函數(shù)文字中對循環(huán)變量的引用。它僅檢查在 defer 或 go 語句(循環(huán)體中的最后一個語句)中調(diào)用函數(shù)文字的實例,否則我們將需要整個程序分析。
該go vet
命令不會抱怨,o
因為 go 語句不是o
循環(huán)中的最后一條語句。
該測試非常簡單,可能會檢測到大多數(shù)錯誤實例。檢測錯誤的其他實例需要一種需要更多時間來開發(fā)和執(zhí)行的方法。

慕田峪7331174
TA貢獻1828條經(jīng)驗 獲得超13個贊
具體來說這個評論:
...這個問題分析起來更具挑戰(zhàn)性,因為它需要證明該函數(shù)不是在循環(huán)內(nèi)調(diào)用的,或者至少無法證明它是在循環(huán)內(nèi)調(diào)用的。一旦匿名函數(shù)被存儲在數(shù)據(jù)結(jié)構(gòu)中或傳遞給另一個函數(shù),vet 就無法再精確地確定何時可能調(diào)用它。
換句話說,我認為當前的獸醫(yī)檢查可能與我們在沒有過程間分析的情況下所能做的一樣好。
- 2 回答
- 0 關(guān)注
- 160 瀏覽
添加回答
舉報
0/150
提交
取消