コンテンツにスキップ

並行性ミュータント

オプトインの concurrency オペレータ (-operators default,concurrency) は、実際の Go の並行性 バグをその修正を反転させることで模倣する (Tu et al., “Understanding real-world concurrency bugs in Go”, ASPLOS 2019)。defer f() を削除するかその場で実行する、go f() をインラインで 実行する、送信 ch <- v を削除する、make(chan T) にバッファ 1 を与え make(chan T, n) から バッファを取り除く (実行時に計算されるサイズなら 1 増やす)、select の case のチャネルを nil に して決して発火しないようにする、atomic.AddT(&x, d) / atomic.StoreT(&x, v) を通常の x += d / x = v にする、once.Do(f)f() にする、である。closeLock / Unlock、 WaitGroup の Add / Done / Waitcancel() の削除は呼び出し文の削除であり、voidcall が すでに行う。

これらの kill はスケジューリングに依存する。テストバイナリをレースディテクタ付きでビルドし (go test -c -racemutation_testrace 属性)、持ち込まれたデータ競合がそれに当たった テストを失敗させるようにし、run -confirm-kills N で kill を確認する。デッドロックする ミュータントはミュータントごとのタイムアウトに達し、kill として数えられる (TIMEOUT)。