Lua Lint |
|
來源: http://place.org/~nop/lualint-0.0.tar.gz(本機:檔案:wiki_insecure/users/nop/lualint)(github:https://github.com/philips/lualint)
用法: lualint [-r|-s] 檔案名.lua [ [-r|-s] [檔案名.lua] ...]
lualint 使用 luac 的位元組碼清單。它會回報所有對未宣告全域變數的存取,這可以用於找出變數名稱的許多錯誤輸入。例如
local really_aborting local function abort() os.exit(1) end if not os.getenv("HOME") then realy_aborting = true abortt() end
回報
/tmp/example.lua:4: *** global SET of realy_aborting /tmp/example.lua:5: global get of abortt
它的主要設計用途是 LTN7 樣式的模組,其中每個原始檔僅會匯出一項全域符號。(包含在檔案「foobar.lua」中的模組,應該只會匯出符號「foobar」。)
對於非 LTN7 樣式的來源,有一個「寬鬆」模式。它只會偵測從未設定過的全域變數的讀取。選項「-r」會讓 lualint 進入寬鬆模式,使用於下一個檔案;「-s」會切換回嚴格模式。
必要套件會被記錄追蹤,但不是遞迴。如果你呼叫「myext.process()」,你應該需要「myext」,且不依賴其他相依性來載入它。LUA_PATH 會像往常一樣來找出需求。
有些(並非嚴格遵守 LTN7)模組可能會希望將其他變數匯出到全域環境。若要這麼做,請使用宣告函式
declare "xpairs" function xpairs(node) [...]
類似地,若要讓偵測到讀取全域變數的警告訊息變為「安靜」(你已經知道可能無法使用這些變數)
lint_ignore "lua_fltk_version" if lua_fltk_version then print("fltk loaded") end
其中一種在「宣告.lua」模組中定義這些的方法是
function declare(s) end declare "lint_ignore" function lint_ignore(s) end
(設定宣告是沒問題的,因為它在「宣告」模組中。)這些函式不需要做任何事,或者實際存在!它們可以位在非執行碼中
if false then declare "xpairs" end
這是因為 lualint 只會對位元組碼執行相當原始且走馬看花的掃描。也許宣告只能在主要區塊中被允許。
錯誤並未以任何特定順序輸出。
應該切換到 RiciLake 的剖析器,它應該能做得更好,並允許偵測一些其他常見情況。
JayCarlson(nop@nop.com)
這全都是 Ben Jackson(ben@ben.com)的錯,他在 MOO 中做了些類似的技巧。