clang ast获取初始化节点的子节点的cinit属性

时间:2019-05-16 10:31:15

标签: clang abstract-syntax-tree initializer libclang

我有以下简单的C代码

int result1 = 1;
int result2 = 2;

void *p[] =
{
    &result1,
    &result2
};

result1和result2用其地址初始化p数组。 AST转储,使用clang,此代码是:

TranslationUnitDecl 0x5581fd31a1d8 <<invalid sloc>> <invalid sloc>
|-VarDecl 0x5581fd31ae68 <1.c:2:1, col:15> col:5 used result1 'int' cinit
| `-IntegerLiteral 0x5581fd373e40 <col:15> 'int' 1
|-VarDecl 0x5581fd373e78 <line:3:1, col:15> col:5 used result2 'int' cinit
| `-IntegerLiteral 0x5581fd373ed8 <col:15> 'int' 2
`-VarDecl 0x5581fd373f50 <line:5:1, line:9:1> line:5:7 p 'void *[2]' cinit
  `-InitListExpr 0x5581fd3740c0 <line:6:1, line:9:1> 'void *[2]'
    |-ImplicitCastExpr 0x5581fd374100 <line:7:5, col:6> 'void *' <BitCast>
    | `-UnaryOperator 0x5581fd374008 <col:5, col:6> 'int *' prefix '&'
    |   `-DeclRefExpr 0x5581fd373fb0 <col:6> 'int' lvalue Var 0x5581fd31ae68 'result1' 'int'
    `-ImplicitCastExpr 0x5581fd374120 <line:8:5, col:6> 'void *' <BitCast>
      `-UnaryOperator 0x5581fd374050 <col:5, col:6> 'int *' prefix '&'
        `-DeclRefExpr 0x5581fd374028 <col:6> 'int' lvalue Var 0x5581fd373e78 'result2' 'int'

在ast转储中,我们可以看到p具有cinit属性(带有赋值的C样式初始化。),但是初始化器是它的子代。 我想知道是否有使用clang API的“简便”方法为此类cinit节点获取对其进行初始化的子级? 初始化此节点的节点不是其子节点,而是后代。

我不想检查每个DeclRefExpr的父母之一是否具有cinit属性。在大型代码库中,它可能会影响AST遍历性能。

0 个答案:

没有答案