diff --git a/lang/correctness/index_by_threadid.jl b/lang/correctness/index_by_threadid.jl new file mode 100644 index 0000000..5fcdc5c --- /dev/null +++ b/lang/correctness/index_by_threadid.jl @@ -0,0 +1,27 @@ +using Base.Threads: threadid, @threads + +states = zeros(10) +Threads.@threads for i = 1:10 + # ruleid: index-by-threadid + tid = Threads.threadid() + old_val = states[tid] + new_val = old_val + i + states[tid] = new_val +end + +@threads for i = 1:10 + # ruleid: index-by-threadid + tid = threadid() + val = states[tid] + states[tid] = val + 1 +end + +@threads :foo for i = 1:10 + # ruleid: index-by-threadid + val = states[Threads.threadid()] +end + +Threads.@threads :static for i = 1:10 + # ok: index-by-threadid + val = states[Threads.threadid()] +end diff --git a/lang/correctness/index_by_threadid.yaml b/lang/correctness/index_by_threadid.yaml new file mode 100644 index 0000000..9b4d6c5 --- /dev/null +++ b/lang/correctness/index_by_threadid.yaml @@ -0,0 +1,31 @@ +rules: + - id: index-by-threadid + patterns: + - pattern-inside: | + @threads ... for $X = ... + ... + end + - pattern-not-inside: | + @threads :static for $X = ... + ... + end + - pattern-either: + - pattern: $S[Threads.threadid()] + - pattern: $S[threadid()] + - pattern: | + $TID = Threads.threadid() + ... + $Y = $S[$TID] + - pattern: | + $TID = threadid() + ... + $Y = $S[$TID] + message: Indexing by `threadid()` may cause race conditions and should be avoided. + metadata: + confidence: LOW + references: + - https://www.julialang.org/blog/2023/07/PSA-dont-use-threadid/ + license: LGPL + languages: + - julia + severity: WARNING