4

我正在尝试修改/重构输入 C 源代码。我试图在printf我的输入代码的每一行之后添加一个语句。

例如,如果我的输入是 -

void foo(){
    // Sample input code
    int a = 0, b = 0;
    a++;
    if(a<5)
         b++;
    b--;
}

我想添加声明printf('Hi');,导致 -

void foo(){
    int a = 0, b = 0;
    printf('Hi');
    a++;
    printf('Hi');
    if(a<5){
         b++;
         printf('Hi');
    }
    printf('Hi');
    b--;
    printf('Hi');
}

作为第一步,我只是尝试声明一个变量test并尝试将其插入到由随机源代码生成的 AST 的开头。这是我在将 AST 提取到对象后所涉及的 python 代码ast-

for i in range(0,len(ast.ext)):
    ## Look for a function named 'foo'
    if(type(ast.ext[i]) == c_ast.FuncDef and ast.ext[i].decl.name == 'foo'):
        ## Store the list of AST node objects in functionBody
        functionBody    = ast.ext[i].body

        ## Create a Decl object for the variable test
        id_obj          = c_ast.ID('test')
        identifier_obj  = c_ast.IdentifierType(['int'])
        typedecl_obj    = c_ast.TypeDecl(id_obj.name,[],identifier_obj)
        decl_obj        = c_ast.Decl(id_obj.name,[],[],[],typedecl_obj,[],[])

        ## Append the object to a list.
        ## Concatenate to a copy of existing list of AST objects     
        lst1 = []
        lst1.append(decl_obj)
        lst2 = []
        lst2 = copy.deepcopy(functionBody.block_items)
        lst3 = []
        lst3 = lst1+lst2

        ## Create a modified AST and print content
        functionBody1 = c_ast.Compound(lst3)
        functionBody1.show()

我发现结果结构没有变化,functionBody1并且每当我尝试使用它的show( )方法时也会出现以下错误。

'list' object has no attribute 'show'

知道我要去哪里偏离轨道吗?

谢谢

4

1 回答 1

2

我发现三个地方你通过了一个你应该通过的地方没有。

## Create a Decl object for the variable test
id_obj          = c_ast.ID('test')
identifier_obj  = c_ast.IdentifierType(['int'])
typedecl_obj    = c_ast.TypeDecl(id_obj.name,None,identifier_obj)
decl_obj        = c_ast.Decl(id_obj.name,[],[],[],typedecl_obj,None,None)

我对此并不是很熟悉,因为我也在学习 pycparser,但是这个更改为我修复了你的回溯。

于 2012-06-10T00:38:02.983 回答