如何找出一个变量是否在clang AST的特定源位置的作用域中

How to find out if a variable is in the scope of a specific source location in clang AST?

本文关键字:AST 作用域 位置 clang 何找出 是否 变量 一个      更新时间:2023-10-16

我正在使用clang编写一个自动修复程序。有时,程序需要通过错误部分范围内的变量来生成一些代码。首先,它收集方法(包含有问题的部分)中的所有变量,然后检查哪些属于有问题的部分的范围。我怎样才能发现一个变量是否属于某个源位置的范围?例如,我有一个这样的代码:

int a = 12;
{
    int b = 77;
}
if (i > 0 //FAULTY SECTION) 
{
 //do something 
}

现在程序需要生成一些代码并将上面的代码更改为如下所示:

int a = 12;
{
    int b = 77;
}
if (i > 0 && a > 0) 
{
 //do something 
}

很明显,b不属于错误部分的范围,我的程序不应该尝试像下面这样的东西,因为语法上是错误的:

if (i > 0 && b > 0) 
{
 //do something 
}

程序如何发现b不存在于错误段的作用域中而不尝试最后一段代码?

因此,您试图以编程方式找出两个变量是否共享相同的作用域。你有你的范围操作符{和}。因此,在解析源代码时,您可以创建一个树来跟踪变量的作用域,例如:

tree scopes // variable
list current_branch // variable pointing to current branch
current_branch = scopes.addRoot() // root or main scope
start parsing {
    if scope start operator met:
        current_branch = current_branch.addNewBranch() // branch down
    if variable met:
        current_branch.addVariable(theVariable) // variables in the same scope will be added to the same branch
    if scope end operator met:
        current_branch = current_branch.parent // go up a branch
}

然后,你将拥有一个变量作用域树,你可以通过在树中查找一个变量并检查另一个变量是否在同一分支中来检查它们是否共享相同的作用域。

不要忘记,如果变量foo在另一个变量bar所在的父分支中,那么foo将仍然在bar的作用域中。

的例子:

int foo;
{
    int bar; // foo still in scope
}