我正在尝试为vera静态分析仪编写规则.由于我没有在这里找到一个维拉组,并且维拉使用TCL来实施其分析规则,我发布到TCL论坛.我曾经在vera inspirel.com/vera/ce/doc/tclapi.html上工作,但由于我不了解TCL,所以我希望建议进一步研究.
由于我是TCL编程的初学者,但是想知道TCL程序在C源代码文件中列出所有局部变量的方法吗?我的意思是什么方法以及它如何实现?
我面临的问题是解析C源代码文件以检测局部变量声明?
解决方法:
使用vera规则解析本地(或任何其他)变量定义非常复杂,但当然可行.基本的C解析和标记化由vera完成.
基本方法是使用vera的getTokens函数和一个检查已完成的C语句的小型状态机.您需要收集令牌(并且可能是他们的值,因为您稍后需要变量名来设置列表)并连接它们直到您有完整的语句.如果您有完整的语句,则可以使用正则表达式检查它是否为变量定义,并从子匹配中提取变量名称.此外,你需要记住你是否在{}块内,知道它是否是局部变量定义.
您可以找到一个示例,用于构建一个简单的状态机,以便将令牌收集到维拉规则T019中的语句中,该规则检查完整的花括号代码块,作为起点.
我已经用vera解析变量定义(以检查各种命名约定),但遗憾的是无法发布完整的代码,因为它是我的雇主的专有工作.但我可以给你一个片段,显示我用来检查变量声明的正则表达式:
set isVar false
if [regexp {\s+((extern\s+)?(static\s+|mutable\s+|register\s+|volatile\s+)?(const\s+)?)?((identifier#[^#]+#\s+colon_colon\s+)*identifier#[^#]+#)\s+(star\s+|const\s+|and\s+|less.*greater\s+|greater\s+)*(identifier#[^#]+#\s+colon_colon\s+)*identifier#([^#]+)#(\s+leftbracket.*rightbracket)?(\s+assign)?.*semicolon$} $statement m s1 s2 s3 s4 s5 s6 s7 s8 s9 s10] {
set locVarname $s9
set isVar true
set currentMatch $m
} elseif [regexp {\s+((extern\s+)?(static\s+|mutable\s+|register\s+|volatile\s+)?(const\s+)?)?(char\s+|int\s+|short\s+|long\s+|void\s+|bool\s+|double\s+|float\s+|unsigned\s+|and\s+|star\s+|unsigned\s+)+(identifier#[^#]+#\s+colon_colon)*\s+identifier#([^#]+)#(\s+leftbracket.*rightbracket)?(\s+assign)?.*semicolon$} $statement m s1 s2 s3 s4 s5 s6 s7 s8] {
set locVarname $s7
set isVar true
set currentMatch $m
}
$statement包含前面提到的完整语句.请注意,我使用标识符#< value>#将标记值连接到标识符标记,并使用正则表达式组来提取它.