diff --git a/go/anonymous-race-condition.go b/go/anonymous-race-condition.go index 1bf3af0..aeca06c 100644 --- a/go/anonymous-race-condition.go +++ b/go/anonymous-race-condition.go @@ -34,6 +34,14 @@ func main() { AnonRaceCond_3_FP() AnonRaceCond_4() AnonRaceCond_4_FP() + AnonRaceCond_5() + AnonRaceCond_6() + AnonRaceCond_7() + AnonRaceCond_7_FP() + AnonRaceCond_8() + AnonRaceCond_8_FP() + AnonRaceCond_9() + AnonRaceCond_9_FP() } func func1() { @@ -44,7 +52,6 @@ func func2() { fmt.Println("I am function func2") } - func ConcurrentFunctions_TP(fns ...func()) { var wg sync.WaitGroup // ruleid: anonymous-race-condition @@ -104,7 +111,7 @@ func AnonRaceCond_1_FP() { func AnonRaceCond_2() { var wg sync.WaitGroup // ruleid: anonymous-race-condition - for i := 0; i< len(numbers); i++ { + for i := 0; i < len(numbers); i++ { wg.Add(1) go func() { fmt.Println(i) @@ -115,11 +122,10 @@ func AnonRaceCond_2() { wg.Wait() } - func AnonRaceCond_2_FP() { var wg sync.WaitGroup // ok: anonymous-race-condition - for i := 0; i< len(numbers); i++ { + for i := 0; i < len(numbers); i++ { wg.Add(1) go func(n int) { fmt.Println(n) @@ -133,7 +139,7 @@ func AnonRaceCond_2_FP() { func AnonRaceCond_3_FP() { var wg sync.WaitGroup // ok: anonymous-race-condition - for i := 0; i< len(numbers); i++ { + for i := 0; i < len(numbers); i++ { cpy := i wg.Add(1) go func() { @@ -174,7 +180,6 @@ func AnonRaceCond_4_FP() { wg.Wait() } - func AnonRaceCond_5() { var wg sync.WaitGroup // ok: anonymous-race-condition @@ -206,3 +211,99 @@ func AnonRaceCond_6() { wg.Wait() } + +func AnonRaceCond_7() { + var wg sync.WaitGroup + // ruleid: anonymous-race-condition + for idx, val := range values { + wg.Add(1) + fmt.Println(val) + go func() { + fmt.Println("Completed index", idx) + wg.Done() + }() + } + + wg.Wait() +} + +func AnonRaceCond_7_FP() { + var wg sync.WaitGroup + // ok: anonymous-race-condition + for idx, val := range values { + wg.Add(1) + idx := idx + fmt.Println(val) + go func() { + fmt.Println("Completed index", idx) + wg.Done() + }() + } + + wg.Wait() +} + +func AnonRaceCond_8() { + var wg sync.WaitGroup + for _, num := range numbers { + // ruleid: anonymous-race-condition + for _, val := range values { + fmt.Println(num) + wg.Add(1) + go func() { + defer wg.Done() + fmt.Println(val) + }() + } + } + wg.Wait() +} + +func AnonRaceCond_8_FP() { + var wg sync.WaitGroup + // ok: anonymous-race-condition + for _, num := range numbers { + for _, val := range values { + num, val := num, val + fmt.Println(num) + wg.Add(1) + go func() { + defer wg.Done() + fmt.Println(val) + }() + } + } + wg.Wait() +} + +func AnonRaceCond_9() { + var wg sync.WaitGroup + // ruleid: anonymous-race-condition + for _, num := range numbers { + for _, val := range values { + fmt.Println(val) + wg.Add(1) + go func() { + defer wg.Done() + fmt.Println(num) + }() + } + } + wg.Wait() +} + +func AnonRaceCond_9_FP() { + var wg sync.WaitGroup + for _, num := range numbers { + // ruleid: anonymous-race-condition + for _, val := range values { + fmt.Println(num) + wg.Add(1) + go func() { + defer wg.Done() + fmt.Println(val) + }() + } + } + wg.Wait() +} diff --git a/go/anonymous-race-condition.yaml b/go/anonymous-race-condition.yaml index 9f5618d..e644679 100644 --- a/go/anonymous-race-condition.yaml +++ b/go/anonymous-race-condition.yaml @@ -28,6 +28,16 @@ rules: }(...) ... } + - pattern: | + for $Y, $X := range ... { + ... + go func(...){ + ... + $FOO(..., $Y, ...) + ... + }(...) + ... + } - pattern: | for $Y, $X := range ... { ... @@ -59,68 +69,28 @@ rules: ... } - pattern-not: | - for $X, $Y := range ... { - ... - go func(..., $V, ...){ - ... - $FOO(..., $V, ...) - ... - }(..., $Y, ...) - ... - } - - pattern-not: | - for $Y, $X := range ... { - ... - go func(..., $CP, ...){ - ... - $CP(...) - ... - }($X) - ... - } - - pattern-not: | - for $X:=...;$Y;$Z { - ... - go func(..., $V, ...) { - ... - $FOO(..., $V,...) - ... - }(..., $X, ...) - ... - } - - pattern-not: | - for $X, $Y := range ... { + for ..., $X := range ... { ... - $COPY := $Y + ..., $X := ..., $X ... go func(...){ ... - $FOO(..., $COPY, ...) + $FOO(..., $X, ...) ... }(...) ... } - pattern-not: | - for $X:=...;$Y;$Z { - ... - $COPY := $X - ... - go func(...) { + for ..., $X := range ... { ... - $FOO(..., $COPY,...) + $X, ... := $X, ... ... - }(...) - ... - } - - pattern-not: | - for $Y, $X := range ... { - ... - $Y, $X := $Y, $X - ... - go func(...){ + go func(...){ + ... + $FOO(..., $X, ...) + ... + }(...) ... - <... $X.$VAR ...> - }(...) } - pattern-not: | for $Y, $X := range ... { @@ -129,6 +99,6 @@ rules: ... go func(...){ ... - <... $Y.$VAR ...> }(...) + ... }