程序员人生 网站导航

skynet lua 代码静态分析

栏目:综合技术时间:2016-12-02 09:25:24
skynet是1款为多人在线游戏设计的服务端框架,使用C+Lua开发。skynet这套框架的1个优点是,通常只需要写lua代码,很少用到c做开发,1定程度上提高了开发效力。而skynet文档相对较少,所以这里利用1点时间学习和总结skynet相干内容,文章就讲授下skynet lua代码静态分析。

skynet项目大部份代码应当是lua代码,而这部份代码,在skynet启动前不需要手动编译,直接启动skynet就能够跑起来。也就是说,对lua代码,skynet没有提供编译工具,其实也没有必要提供。

但是,这对开发来讲,有时候却很不友好,由于lua代码需要等skynet跑起来且履行到才知道是不是有毛病。

所以,这里讲授如何对skynet lua项目进行代码静态分析,在开发的时候尽早发现问题。固然,文章除适用skynet项目,还适用其他使用lua的项目。

lua项目代码静态分析的方法有两个:
1、使用lua编译器(luac)进行分析
2、使用luacheck插件进行分析

第1种方法,利用lua编译器对lua代码进行语法检查。这类方法简单有效,具体方法我在之前的文章介绍过,有兴趣点这里浏览。skynet项目lua代码简单加密 -- 没有开花的树 csdn

第2种方法,使用Luacheck对lua代码进行分析。这类方法是我比较推荐的,luacheck是个优秀的第3方插件,代码是MIT开源的,有兴趣点这里围观。Luacheck Git


Lua分析器(Luacheck)

Luacheck介绍

Luacheck是Lua1个静态分析工具,与Lua语言编译器相比,Luacheck可以对lua程序进行更加严格的毛病分析。它不但可以检查出lua语法问题,而且可以检查那些完全合乎语法但却极可能是毛病的代码。换句话说,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依赖lua,使用请确保lua已安装

如果想检查全部项目的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参数说明

Luacheck值得推荐的地方,除能查找lua毛病,更重要的是,它可以自定义捕捉的毛病类型。可能有些写法我们不认为是错的,就能够避免显示出来。
# 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[] ...]

这里重点介绍以下几个参数:
--no-unused 疏忽变量未使用
--no-unused-args 疏忽参数未使用
--no-redefined 疏忽变量重定义
--globals... 疏忽哪些全局变量
--ignore... 疏忽哪些毛病提示
--quiet 只显示有毛病的文件提示
--codes 显示毛病编号


Luacheck示例

以例子说明前面几个参数吧。
# 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

解释以上,个别参数分别代表甚么意思?
--globals table string 疏忽全局变量table、string的声明和使用
--ignore 542 512 疏忽编号为542、512的毛病

至于 542 512分别代表甚么,怎样得到的,看这里。

怎样得到1个毛病的编号?
# 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就是这个毛病的编号,所以 --ignore 512就是疏忽这个毛病提示。

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐