Skip to content

Added luacheck for linting Lua files and static analysis

Marek Vavrusa requested to merge add-lua-linter into master

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

Merge request reports