Added luacheck for linting Lua files and static analysis
This is super useful for checking things like misusing undefined variables or modifying globals, especially in modules when it's not immediately visible which variables are in the global namespace and which are not.
I added several exceptions for files in daemon/lua and tests, as for example sandbox module needs to legitimately modify global namespace.
There's a lot of things failing, so I didn't make it part of the
standard make check
, but we should eventually enable it to
improve code quality and spot problems with CI.
luacheck has also bindings for many editors, so you can get helpful linting as-you-type, for example: https://github.com/SublimeLinter/SublimeLinter-luacheck or https://github.com/vim-syntastic/syntastic
The current list of failures:
$ make lint
tests/tests.mk:12: cmocka not found, skipping unit tests
luacheck --codes .
Checking daemon/lua/config.lua OK
Checking daemon/lua/kres-gen.lua 2 warnings
daemon/lua/kres-gen.lua:1:49: (W113) accessing undefined variable ffi
daemon/lua/kres-gen.lua:162:121: (W631) line is too long (185 > 120)
Checking daemon/lua/kres.lua 43 warnings
daemon/lua/kres.lua:10:11: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:11:14: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:14:1: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:201:18: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:202:20: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:203:1: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:213:19: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:214:22: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:215:1: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:219:31: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:223:11: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:233:11: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:241:25: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:249:18: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:251:18: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:257:15: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:263:5: (W511) unreachable code
daemon/lua/kres.lua:269:11: (W211) unused variable i
daemon/lua/kres.lua:283:20: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:284:1: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:288:11: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:319:7: (W612) line contains trailing whitespace
daemon/lua/kres.lua:331:7: (W211) unused variable ub_t
daemon/lua/kres.lua:331:14: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:332:20: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:333:1: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:335:31: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:339:22: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:340:1: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:373:9: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:373:20: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:382:15: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:396:1: (W621) inconsistent indentation (SPACE followed by TAB)
daemon/lua/kres.lua:412:21: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:417:10: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:421:14: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:422:7: (W213) unused loop variable k_
daemon/lua/kres.lua:430:34: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:431:38: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:434:17: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:435:10: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:443:10: (W113) accessing undefined variable ffi
daemon/lua/kres.lua:445:31: (W113) accessing undefined variable ffi
Checking daemon/lua/sandbox.lua 12 warnings
daemon/lua/sandbox.lua:81:22: (W212) unused argument t
daemon/lua/sandbox.lua:112:25: (W212) unused argument t
daemon/lua/sandbox.lua:183:26: (W212) unused argument t
daemon/lua/sandbox.lua:216:8: (W211) unused variable status
daemon/lua/sandbox.lua:248:13: (W113) accessing undefined variable result
daemon/lua/sandbox.lua:251:14: (W113) accessing undefined variable result
daemon/lua/sandbox.lua:252:14: (W113) accessing undefined variable result
daemon/lua/sandbox.lua:253:14: (W113) accessing undefined variable result
daemon/lua/sandbox.lua:254:14: (W113) accessing undefined variable result
daemon/lua/sandbox.lua:256:14: (W113) accessing undefined variable result
daemon/lua/sandbox.lua:261:12: (W113) accessing undefined variable result
daemon/lua/sandbox.lua:263:9: (W113) accessing undefined variable result
Checking daemon/lua/trust_anchors.lua 13 warnings
daemon/lua/trust_anchors.lua:11:14: (W211) unused variable h
daemon/lua/trust_anchors.lua:11:17: (W211) unused variable s
daemon/lua/trust_anchors.lua:178:51: (W212) unused argument ev
daemon/lua/trust_anchors.lua:201:7: (W213) unused loop variable i
daemon/lua/trust_anchors.lua:214:6: (W213) unused loop variable i
daemon/lua/trust_anchors.lua:251:6: (W213) unused loop variable _k
daemon/lua/trust_anchors.lua:287:6: (W213) unused loop variable _k
daemon/lua/trust_anchors.lua:299:6: (W213) unused loop variable i
daemon/lua/trust_anchors.lua:321:6: (W213) unused loop variable i
daemon/lua/trust_anchors.lua:341:9: (W213) unused loop variable ta
daemon/lua/trust_anchors.lua:348:2: (W311) value assigned to variable keepset is unused
daemon/lua/trust_anchors.lua:351:6: (W213) unused loop variable i
daemon/lua/trust_anchors.lua:405:6: (W213) unused loop variable i
Checking daemon/lua/zonefile.lua 1 warning
daemon/lua/zonefile.lua:128:7: (W211) unused variable const_char_t
Checking modules/daf/daf.lua 10 warnings
modules/daf/daf.lua:108:30: (W612) line contains trailing whitespace
modules/daf/daf.lua:160:17: (W212) unused argument req
modules/daf/daf.lua:160:22: (W212) unused argument qry
modules/daf/daf.lua:177:6: (W213) unused loop variable i
modules/daf/daf.lua:188:6: (W213) unused loop variable i
modules/daf/daf.lua:197:6: (W213) unused loop variable i
modules/daf/daf.lua:206:24: (W212) unused argument val
modules/daf/daf.lua:209:23: (W212) unused argument val
modules/daf/daf.lua:298:24: (W212) unused argument h
modules/daf/daf.lua:326:19: (W212) unused argument conf
Checking modules/dns64/dns64.lua 11 warnings
modules/dns64/dns64.lua:3:7: (W211) unused variable bit
modules/dns64/dns64.lua:18:3: (W111) setting non-standard global variable qry
modules/dns64/dns64.lua:20:30: (W113) accessing undefined variable qry
modules/dns64/dns64.lua:25:6: (W113) accessing undefined variable qry
modules/dns64/dns64.lua:48:7: (W113) accessing undefined variable qry
modules/dns64/dns64.lua:54:70: (W113) accessing undefined variable qry
modules/dns64/dns64.lua:55:11: (W113) accessing undefined variable qry
modules/dns64/dns64.lua:55:34: (W113) accessing undefined variable qry
modules/dns64/dns64.lua:57:30: (W113) accessing undefined variable qry
modules/dns64/dns64.lua:60:11: (W211) unused variable next
modules/dns64/dns64.lua:60:80: (W113) accessing undefined variable qry
Checking modules/graphite/graphite.lua 7 warnings
modules/graphite/graphite.lua:79:17: (W212) unused argument module
modules/graphite/graphite.lua:88:19: (W212) unused argument module
modules/graphite/graphite.lua:106:23: (W212) unused argument graphite
modules/graphite/graphite.lua:107:11: (W221) variable err is never set
modules/graphite/graphite.lua:124:7: (W213) unused loop variable key
modules/graphite/graphite.lua:125:4: (W113) accessing undefined variable graphite
modules/graphite/graphite.lua:128:3: (W113) accessing undefined variable graphite
Checking modules/http/http.lua 5 warnings
modules/http/http.lua:37:15: (W113) accessing undefined variable moduledir
modules/http/http.lua:74:31: (W113) accessing undefined variable title
modules/http/http.lua:76:19: (W212) unused argument h
modules/http/http.lua:292:59: (W113) accessing undefined variable err
modules/http/http.lua:314:33: (W212) unused argument ev
Checking modules/http/prometheus.lua 7 warnings
modules/http/prometheus.lua:29:29: (W212) unused argument h
modules/http/prometheus.lua:29:32: (W212) unused argument ws
modules/http/prometheus.lua:34:31: (W212) unused argument h
modules/http/prometheus.lua:34:34: (W212) unused argument ws
modules/http/prometheus.lua:35:8: (W211) unused variable ok
modules/http/prometheus.lua:69:121: (W631) line is too long (142 > 120)
modules/http/prometheus.lua:85:29: (W212) unused argument h
Checking modules/ketcd/ketcd.lua 6 warnings
modules/ketcd/ketcd.lua:7:6: (W213) unused loop variable i
modules/ketcd/ketcd.lua:21:8: (W431) shadowing upvalue ketcd on line 2
modules/ketcd/ketcd.lua:26:37: (W612) line contains trailing whitespace
modules/ketcd/ketcd.lua:29:21: (W212) unused argument module
modules/ketcd/ketcd.lua:34:23: (W212) unused argument module
modules/ketcd/ketcd.lua:46:13: (W612) line contains trailing whitespace
Checking modules/policy/policy.lua 18 warnings
modules/policy/policy.lua:2:7: (W211) unused variable bit
modules/policy/policy.lua:46:2: (W111) setting non-standard global variable sock
modules/policy/policy.lua:47:5: (W113) accessing undefined variable sock
modules/policy/policy.lua:50:9: (W113) accessing undefined variable sock
modules/policy/policy.lua:138:18: (W212) unused argument state
modules/policy/policy.lua:157:26: (W212) unused argument state
modules/policy/policy.lua:189:35: (W212) unused argument state
modules/policy/policy.lua:247:18: (W212) unused argument req
modules/policy/policy.lua:247:23: (W212) unused argument query
modules/policy/policy.lua:254:18: (W212) unused argument req
modules/policy/policy.lua:267:18: (W212) unused argument req
modules/policy/policy.lua:286:18: (W212) unused argument req
modules/policy/policy.lua:309:9: (W422) shadowing definition of argument action on line 294
modules/policy/policy.lua:323:18: (W212) unused argument req
modules/policy/policy.lua:325:9: (W432) shadowing upvalue argument action on line 320
modules/policy/policy.lua:394:69: (W612) line contains trailing whitespace
modules/policy/policy.lua:397:6: (W612) line contains trailing whitespace
modules/policy/policy.lua:581:1: (W611) line contains only whitespace
Checking modules/predict/predict.lua 20 warnings
modules/predict/predict.lua:30:24: (W212) unused argument ev
modules/predict/predict.lua:32:11: (W213) unused loop variable val
modules/predict/predict.lua:52:16: (W211) unused function enqueue
modules/predict/predict.lua:63:15: (W612) line contains trailing whitespace
modules/predict/predict.lua:66:68: (W614) trailing whitespace in a comment
modules/predict/predict.lua:69:2: (W111) setting non-standard global variable queued
modules/predict/predict.lua:70:35: (W612) line contains trailing whitespace
modules/predict/predict.lua:73:4: (W111) setting non-standard global variable queued
modules/predict/predict.lua:73:13: (W113) accessing undefined variable queued
modules/predict/predict.lua:76:9: (W113) accessing undefined variable queued
modules/predict/predict.lua:82:46: (W612) line contains trailing whitespace
modules/predict/predict.lua:103:11: (W213) unused loop variable v
modules/predict/predict.lua:114:26: (W212) unused argument ev
modules/predict/predict.lua:123:17: (W614) trailing whitespace in a comment
modules/predict/predict.lua:127:41: (W614) trailing whitespace in a comment
modules/predict/predict.lua:134:1: (W611) line contains only whitespace
modules/predict/predict.lua:137:1: (W611) line contains only whitespace
modules/predict/predict.lua:154:23: (W212) unused argument module
modules/predict/predict.lua:161:25: (W212) unused argument module
modules/predict/predict.lua:185:21: (W212) unused argument state
Checking modules/renumber/renumber.lua 13 warnings
modules/renumber/renumber.lua:2:7: (W211) unused variable policy
modules/renumber/renumber.lua:4:7: (W211) unused variable bit
modules/renumber/renumber.lua:59:4: (W311) value assigned to variable to_copy is unused
modules/renumber/renumber.lua:63:5: (W612) line contains trailing whitespace
modules/renumber/renumber.lua:68:21: (W431) shadowing upvalue prefixes on line 5
modules/renumber/renumber.lua:72:3: (W111) setting non-standard global variable pkt
modules/renumber/renumber.lua:74:19: (W113) accessing undefined variable pkt
modules/renumber/renumber.lua:92:17: (W113) accessing undefined variable pkt
modules/renumber/renumber.lua:93:18: (W113) accessing undefined variable pkt
modules/renumber/renumber.lua:94:17: (W113) accessing undefined variable pkt
modules/renumber/renumber.lua:95:3: (W113) accessing undefined variable pkt
modules/renumber/renumber.lua:96:3: (W113) accessing undefined variable pkt
modules/renumber/renumber.lua:101:5: (W113) accessing undefined variable pkt
Checking modules/ta_signal_query/ta_signal_query.lua 5 warnings
modules/ta_signal_query/ta_signal_query.lua:16:6: (W213) unused loop variable i
modules/ta_signal_query/ta_signal_query.lua:25:6: (W213) unused loop variable i
modules/ta_signal_query/ta_signal_query.lua:46:28: (W212) unused argument ev
modules/ta_signal_query/ta_signal_query.lua:53:40: (W212) unused argument pkt
modules/ta_signal_query/ta_signal_query.lua:54:8: (W412) variable req was previously defined as an argument on line 53
Checking modules/version/version.lua 9 warnings
modules/version/version.lua:3:16: (W211) unused function getLastWord
modules/version/version.lua:15:16: (W211) unused function hex2string
modules/version/version.lua:25:11: (W231) variable first is never accessed
modules/version/version.lua:31:1: (W611) line contains only whitespace
modules/version/version.lua:34:11: (W231) variable first is never accessed
modules/version/version.lua:80:26: (W612) line contains trailing whitespace
modules/version/version.lua:88:5: (W112) mutating non-standard global variable version
modules/version/version.lua:96:8: (W113) accessing undefined variable period
modules/version/version.lua:96:26: (W612) line contains trailing whitespace
Checking modules/view/view.lua 5 warnings
modules/view/view.lua:14:20: (W431) shadowing upvalue view on line 7
modules/view/view.lua:14:32: (W431) shadowing upvalue policy on line 2
modules/view/view.lua:19:20: (W431) shadowing upvalue view on line 7
modules/view/view.lua:19:34: (W431) shadowing upvalue policy on line 2
modules/view/view.lua:34:25: (W431) shadowing upvalue view on line 7
Checking modules/workarounds/workarounds.lua 1 warning
modules/workarounds/workarounds.lua:25:9: (W412) variable req was previously defined as an argument on line 24
Checking scripts/kresd-host.lua 2 warnings
scripts/kresd-host.lua:28:1: (W611) line contains only whitespace
scripts/kresd-host.lua:79:5: (W213) unused loop variable i
Checking scripts/kresd-query.lua OK
Checking tests/config/test_utils.lua 3 warnings
tests/config/test_utils.lua:8:29: (W612) line contains trailing whitespace
tests/config/test_utils.lua:15:6: (W213) unused loop variable k
tests/config/test_utils.lua:20:14: (W612) line contains trailing whitespace
Total: 193 warnings / 0 errors in 22 files