clang rewriter:将结构定义添加到无效程序中

时间:2016-07-04 13:59:55

标签: c++ clang llvm-clang

我需要重写一组C / C ++代码,以便在使用时自动注入结构定义。具体来说,我需要识别形式的函数体:

int func(struct STRUCT_x_y *args) { /* access args->field here */ }

...并在函数体之前生成结构声明,例如:

struct STRUCT_x_y {
    int field;
};

int func(struct STRUCT_x_y *args) { /* access args->field here */ }

当尝试使用Clang的重写器来插入结构声明时(例如,跟this skeleton program之后),我得到错误,因为原始程序文本在没有这些声明的情况下不能编译 - 该函数试图访问未定义的字段结构

是否可以在无效C ++的程序中使用Clang的重写器?我甚至可以进一步限制 - 函数 body 无效,但程序的其余部分都没问题。

(当然,我可以将一些丑陋的解决方案混合在一起,使用正则表达式来排序检测函数签名并生成结构,但我真的更喜欢利用Clang解析器和重写器的强大功能。)< / p>

1 个答案:

答案 0 :(得分:2)

我最终做的只是通过程序两次。在第一次传递期间,我使用了一个空诊断程序,以便忽略所有错误和警告。我收集了签名表明需要生成结构的方法。完成第一次传递后,我生成了所有结构并通过第二次传递运行程序,这次是与诊断程序一起。

一般来说,Clang的AST是不可变的,除了基于纯文本的重写之外,它不会真正允许树修改。但上述方法对我们来说效果相当不错。如果您对上下文感到好奇,这是IOVisor BCC project

的一部分