在进行大型ASP项目变更或使用之前ASP项目的包含文件时,确保不部署不必要的代码变得尤为重要。本文将介绍如何使用ASP代码分析工具来识别项目或文件夹中未使用的代码元素,如未使用的常量、全局变量、函数、子程序和局部变量。
虽然本文不会详细描述代码的工作原理,因为主要议题是如何去除未使用的元素,并且代码实际上是用C#编写的,但会让了解工具的操作方式及其局限性。
ASP代码分析器的使用非常简单。首先下载可执行文件,解压缩并运行ASPCodeAnalyzer.exe
。接下来,可以浏览包含ASP项目的目录。点击“Go”按钮,分析器将开始工作。需要强调的是,分析器不会更改文件,它只会指出代码中存在未使用代码元素的部分。
如果机器上安装了UltraEdit32
,并且双击发现列表,该工具将自动启动UltraEdit32
并打开相应代码行的文件。如果使用其他编辑器,可以使用“文件/选项”对话框来定义编辑器及打开指定文件的参数。
代码必须是语法正确的。否则,分析器将无法正常工作。
第一阶段:首先,分析器列出给定目录及其所有子目录中的.asp
和.inc
文件,并将它们放入队列。然后,队列中的所有文件被读取。如果分析器遇到include
语句,它会将引用的文件添加到队列中(如果尚未在队列中)。如果包含的文件不存在于硬盘上,分析器会在窗口底部的错误列表中写入一条消息。
在读取文件时,它会剥离所有的HTML代码、所有注释(包括rem
注释)以及所有被双引号包围的文本。解析器足够智能,能够将两个连续的双引号视为一个单独的双引号。
现在,原始文件中只剩下代码,分析器创建一个内部的“代码树”:
分析器不会测试类在代码中的使用情况。它也无法测试类的具体成员和方法是否被使用。但是,它会检查局部变量是否被使用。
在构建代码树时,会测试子程序、函数和方法的局部变量的使用情况。这是通过测试变量名称是否在代码块中使用来完成的。
第二阶段:现在到了棘手的部分:寻找未使用的全局变量和子程序/函数。首先,所有元素都被认为是未使用的。然后,所有文件再次以组的形式进行处理。一个组由一个文件加上所有引用的文件组成。
检查当前文件组的所有元素。如果在文件组的代码中任何地方使用了元素的名称,那么该元素就被认为是已使用的。通过检查文件组而不是单独的文件,可以在所有可能的上下文中测试包含文件。
假设分析器想要知道子程序WriteTd
是否在代码块中使用,那么以下语句将被匹配:
call WriteTd( someVar)
call WriteTd ( someVar)
以下语句不匹配,因为子程序的名称实际上是整个标识符的一部分:
call WriteTd2( someVar)
call MyWriteTd( someVar)
请注意:由于其启发式特性,算法可能无法找到代码中的所有未使用元素。但积极的一面是,它的所有发现确实应该是未使用的元素。
分析器无法检测到以下情况:
VBScript
function test
dim unusedVar
unusedVar = 12
end function
尽管变量unusedVar
在技术上是无用的,因为它没有在任何地方用于处理,但分析器不会通知。一般来说,分析器只会指出那些可以删除而不会破坏代码的代码块。
如果使用局部变量来遮蔽全局变量,全局变量总是被认为是已使用的。
VBScript
dim unusedGlobal
function test
dim unusedGlobal
' Shadows the global variable
unusedGlobal = 12
Response.Write( unusedGlobal)
end function
变量不应在多行中定义。在以下代码中:
VBScript
dim a,b,c, _
d,e,f