返回0156 励志(1 / 2)网游之冰封影魔首页

上面这个例子是和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