Vera TCL规则:列出所有本地变量

Vera ++ TCL rule : list all local variables

本文关键字:变量 TCL 规则 Vera      更新时间:2023-10-16

我正在尝试为Vera 静态分析仪编写规则。由于我在这里没有找到Vera 的组,并且Vera 使用TCL实施其用于分析的规则,我发布到TCL论坛上。我曾在vera inspirel.com/vera/ce/doc/tclapi.html上工作过

由于我是TCL编程的初学者,但想知道TCL程序的方法以列出C 源代码文件中的所有本地变量吗?我的意思是什么方法以及如何实现?

我面临的问题是解析C 源代码文件以检测本地变量声明?

使用Vera 规则解析本地(或任何其他)变量定义非常复杂,但当然可以可行。基本的C 解析和令牌化由Vera 完成。

基本方法是将Vera 的getTokens功能与一台检查完成的C 语句的小型机器结合使用。您需要收集令牌(并且可能是它们的值,因为稍后您需要变量名称来设置列表)并将它们串联到完整的语句。如果您有完整的语句,则可以使用正则表达式检查它是否是变量定义,并从submatch中提取变量名。另外,您需要记住您是否在{}块中以了解它是否是局部变量定义。

您可以找到一个用于构建简单statemachine的样本,以将令牌收集到Vera 的规则T019中的语句,该规则T019检查是否有完整的卷发式支撑代码块,以作为起点。

我已经使用Vera (检查各种命名约定)进行了解析,但不幸的是,由于我的雇主是专有工作,因此无法发布完整的代码。但是我可以给您一个片段,显示我用来检查可变声明的正则表达式:

set isVar false
if [regexp {s+((externs+)?(statics+|mutables+|registers+|volatiles+)?(consts+)?)?((identifier#[^#]+#s+colon_colons+)*identifier#[^#]+#)s+(stars+|consts+|ands+|less.*greaters+|greaters+)*(identifier#[^#]+#s+colon_colons+)*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+((externs+)?(statics+|mutables+|registers+|volatiles+)?(consts+)?)?(chars+|ints+|shorts+|longs+|voids+|bools+|doubles+|floats+|unsigneds+|ands+|stars+|unsigneds+)+(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包含前面提到的完整语句。请注意,我使用identifier#<value>#将令牌值与identifier令牌连接在一起,并使用Regex组提取它。

不幸的是,我认为您严重低估了任务的复杂性。问题是您不能对C 文件的内容进行任何猜测(但是受过教育)这样做是很难的。

到目前为止,应该很明显的是,使用哪种编程语言来实施这种解析的问题确实并不那么重要。您肯定可以在TCL中实现此目标,但是问题并不具体,因为以当前形式正确回答它实际上将构成已准备的解析器代码。