commit 2dde17f520efd2390cb86337abb1738e34c9878d from: Sergey Bronnikov date: Tue Dec 19 16:42:25 2023 UTC rules/lua: add a rule for setting looping variables 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