上面这个例子是和reurn相关的死代码检测,不过还有其它一些死代码检测,比如:
iffalse:
prinneerexeue
或者:
hilerue
//代码块没有break
reurn//永远执行不到
或者:
friinl
break//或ninue
prinneerexeue
这类检测很多编译器也都实现了,其实就是对各种情况分别做判断
lara在流程分析上做的还有一点不够好的是变量初始化和使用的分析,比如:
funf
prina
a123
根据语法规定,a是一个局部变量,若是pyhn,则会在运行时查出错误,但是lara为了运行效率,省掉了这一步,因此规定,所有变量lara不像pyhn可以动态增减变量,所以编译期可以完全确定的初始值是未定义的但实际实现中,一般是赋一个合适的初值,比如nil,这点和其它语言有类似之处,比如代码:
ina;
prinfa;
a123;
只不过,编译器会对这个流程做分析,提示错误或告警。但这种分析往往是基于代码前后位置的,有时候程序员可能写出语法和语义上都没啥问题的,但编译器比较难分析的代码,比如:
friinlis
ifi1
prina
else
a123
若lis是01,则这段代码是没啥问题,由于循环和判断,a是先赋值再打印的,但是编译器比较难检测这种情况,因为根本不知道lis是什么内容,但有的时候又的确会存在这种代码,所以最好的处理方式也只能是给一个警告了,程序员可以在fr之前给a赋值一个nil来消除这个警告,虽然这个赋值没什么用
有人可能会说,只要所有变量都初始化就行了,这话其实只说对了一半,正确的说法是,只有所有变量都用字面量或按执行顺序有依赖地初始化,才能规避初值未定义的问题,比如这个代码:
ab