Lua Lint

lua-users home
wiki

lualint 使用 luac 執行 Lua 原始碼中全域變數用法的靜態分析。

來源: 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 中做了些類似的技巧。

授權

麻省理工學院授權。
最近變更 · 偏好設定
編輯 · 歷史記錄
上一次編輯於 2012 年 4 月 25 日,格林威治時間凌晨 2:28 (比較差異)