Commit Diff


commit - d801a397606024fb6e4e3bbbacca06bb055fc656
commit + 2dde17f520efd2390cb86337abb1738e34c9878d
blob - e62724c834e856b3d4c91e319b50ef2b80ebdcca
blob + f0cd683ae8b56776e52308477687dd6bbf1ac9f5
--- README.md
+++ README.md
@@ -31,6 +31,7 @@ $ spatch --sp-file coccinelle/mmap_map_failed.cocci --
 - `basic/cmp_by_reference`
 - `basic/fd_leak`
 - `basic/func_inside_func`
+- `basic/immutable_looping_variables`
 - `basic/loadstring`
 - `basic/magic_number`
 - `basic/pcall_err_handling`
blob - /dev/null
blob + 4c40f3a99a4b414d3fd5cbbe19e1c63a02c29eb8 (mode 644)
--- /dev/null
+++ rules/lua/basic/setting_looping_variables.lua
@@ -0,0 +1,25 @@
+local a = { "one", "two", "three" }
+for i, v in ipairs(a) do
+    -- ruleid: setting_looping_variables
+    v = 1
+    -- ruleid: setting_looping_variables
+    i = 2
+end
+
+for i in ipairs(a) do
+    -- ruleid: setting_looping_variables
+    i = 1
+end
+
+local b = { a = 1, b = 2, c = 3 }
+for k in pairs(b) do
+    -- ruleid: setting_looping_variables
+    k = 3
+end
+
+for k, v in pairs(b) do
+    -- ruleid: setting_looping_variables
+    k = 3
+    -- ruleid: setting_looping_variables
+    v = 3
+end
blob - /dev/null
blob + f19f2b1e1658affc577fa8cd6179b7be91c97058 (mode 644)
--- /dev/null
+++ rules/lua/basic/setting_looping_variables.yaml
@@ -0,0 +1,34 @@
+rules:
+  - id: setting_looping_variables
+    patterns:
+      - pattern-inside: |
+          for $K, $V in ... do
+            ...
+          end
+          for $K in ... do
+            ...
+          end
+      - pattern-not: |
+          for $K in ... do
+            ...
+            $K = ...
+            ...
+          end
+          for $K, $V in ... do
+            ...
+            $V = ...
+            ...
+            $K = ...
+            ...
+          end
+    message: |
+      In a loop the looping variables key and value are locals. So reassigning
+      them, it just changes the value referenced by the local variable. After
+      the first run of the loop, locals run out of scope and are discarded.
+      To change the value in the table reference to the table itself like
+      `t[key] = "hello"`.
+    metadata:
+      references:
+        - http://www.lua.org/manual/5.4/manual.html#3.3.5
+    languages: [lua]
+    severity: WARNING