skynet lua 代碼靜態(tài)分析
來(lái)源:程序員人生 發(fā)布時(shí)間:2016-12-02 09:25:24 閱讀次數(shù):4621次
skynet是1款為多人在線游戲設(shè)計(jì)的服務(wù)端框架,使用C+Lua開(kāi)發(fā)。skynet這套框架的1個(gè)優(yōu)點(diǎn)是,通常只需要寫(xiě)lua代碼,很少用到c做開(kāi)發(fā),1定程度上提高了開(kāi)發(fā)效力。而skynet文檔相對(duì)較少,所以這里利用1點(diǎn)時(shí)間學(xué)習(xí)和總結(jié)skynet相干內(nèi)容,文章就講授下skynet lua代碼靜態(tài)分析。
skynet項(xiàng)目大部份代碼應(yīng)當(dāng)是lua代碼,而這部份代碼,在skynet啟動(dòng)前不需要手動(dòng)編譯,直接啟動(dòng)skynet就能夠跑起來(lái)。也就是說(shuō),對(duì)lua代碼,skynet沒(méi)有提供編譯工具,其實(shí)也沒(méi)有必要提供。
但是,這對(duì)開(kāi)發(fā)來(lái)講,有時(shí)候卻很不友好,由于lua代碼需要等skynet跑起來(lái)且履行到才知道是不是有毛病。
所以,這里講授如何對(duì)skynet lua項(xiàng)目進(jìn)行代碼靜態(tài)分析,在開(kāi)發(fā)的時(shí)候盡早發(fā)現(xiàn)問(wèn)題。固然,文章除適用skynet項(xiàng)目,還適用其他使用lua的項(xiàng)目。
lua項(xiàng)目代碼靜態(tài)分析的方法有兩個(gè):
1、使用lua編譯器(luac)進(jìn)行分析
2、使用luacheck插件進(jìn)行分析
第1種方法,利用lua編譯器對(duì)lua代碼進(jìn)行語(yǔ)法檢查。這類(lèi)方法簡(jiǎn)單有效,具體方法我在之前的文章介紹過(guò),有興趣點(diǎn)這里瀏覽。skynet項(xiàng)目lua代碼簡(jiǎn)單加密 -- 沒(méi)有開(kāi)花的樹(shù) csdn
第2種方法,使用Luacheck對(duì)lua代碼進(jìn)行分析。這類(lèi)方法是我比較推薦的,luacheck是個(gè)優(yōu)秀的第3方插件,代碼是MIT開(kāi)源的,有興趣點(diǎn)這里圍觀。Luacheck Git
Lua分析器(Luacheck)
Luacheck介紹
Luacheck是Lua1個(gè)靜態(tài)分析工具,與Lua語(yǔ)言編譯器相比,Luacheck可以對(duì)lua程序進(jìn)行更加嚴(yán)格的毛病分析。它不但可以檢查出lua語(yǔ)法問(wèn)題,而且可以檢查那些完全合乎語(yǔ)法但卻極可能是毛病的代碼。換句話(huà)說(shuō),Luacheck能檢查到lua程序中潛伏的毛病,如未定義的變量使用,未使用的變量和值,未定義的全局變量使用,履行不到的代碼等等
Luacheck安裝與使用
安裝:
# git clone https://github.com/mpeterv/luacheck.git
# cd luacheck
# ./install.lua /usr
使用:
# luacheck ./install.lua
Checking install.lua OK
Total: 0 warnings / 0 errors in 1 file
注意了,luacheck依賴(lài)lua,使用請(qǐng)確保lua已安裝
如果想檢查全部項(xiàng)目的lua代碼,方法以下:
#!/bin/bash
Luas=`find . -name "*.lua"`
if [ "$Luas" != "" ]; then
luacheck $Luas
fi
保存為 test.sh,履行,大致效果以下:
# chmod +x ./test.sh
# ./test.sh
Checking bin/luacheck.lua OK
Checking spec/check_spec.lua OK
Checking spec/lexer_spec.lua OK
Checking spec/cache_spec.lua OK
Checking spec/globbing_spec.lua OK
Checking spec/config_spec.lua OK
...
Total: 0 warnings / 0 errors in 42 files
Luacheck參數(shù)說(shuō)明
Luacheck值得推薦的地方,除能查找lua毛病,更重要的是,它可以自定義捕捉的毛病類(lèi)型。可能有些寫(xiě)法我們不認(rèn)為是錯(cuò)的,就能夠避免顯示出來(lái)。
# luacheck --help
Usage: luacheck ([--config] | [--no-config]) [-g] [-u] [-r]
[-a] [-s] [--no-self] [--std] [-c] [-d] [-t] [-m]
[--no-inline] [--filename] [-j]
[--formatter] [-q] [--codes] [--ranges]
[--no-color] [-v] [-h][] ...
[--globals [] ...] [--read-globals [] ...]
[--new-globals [] ...]
[--new-read-globals [] ...]
[--ignore[] ...] [--enable[] ...]
[--only[] ...]
[--exclude-files[] ...]
[--include-files[] ...]
這里重點(diǎn)介紹以下幾個(gè)參數(shù):
--no-unused
|
疏忽變量未使用
|
--no-unused-args
|
疏忽參數(shù)未使用
|
--no-redefined
|
疏忽變量重定義
|
--globals...
|
疏忽哪些全局變量
|
--ignore...
|
疏忽哪些毛病提示
|
--quiet
|
只顯示有毛病的文件提示
|
--codes
|
顯示毛病編號(hào)
|
Luacheck示例
以例子說(shuō)明前面幾個(gè)參數(shù)吧。
# luacheck $Luas --no-unused --quiet --no-unused-args --no-redefined --no-color --globals table string --ignore 542 512
Total: 0 warnings / 0 errors in 42 files
解釋以上,個(gè)別參數(shù)分別代表甚么意思?
--globals table string 疏忽全局變量table、string的聲明和使用
--ignore 542 512 疏忽編號(hào)為542、512的毛病
至于 542 512分別代表甚么,怎樣得到的,看這里。
怎樣得到1個(gè)毛病的編號(hào)?
# cat ./test.lua
local t={}
for k,v in pairs(t) do
return k,v
end
# luacheck ./test.lua --codes
Checking test.lua 1 warning
test.lua:2:1: (W512) loop is executed at most once
Total: 1 warning / 0 errors in 1 file
以上,512就是這個(gè)毛病的編號(hào),所以 --ignore 512就是疏忽這個(gè)毛病提示。
生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)