我需要重写一个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的重写器插入结构声明(例如,跟随这个骨架程序)时,我会收到错误,因为没有这些声明,原始程序文本不会编译--函数尝试访问未定义结构上的字段。
是否有可能在一个无效的C++程序上使用Clang的重写器?我甚至可以设置一个进一步的限制--函数体无效,但是程序的其余部分都很好。
(当然,我可以利用一些丑陋的解决方案,使用正则表达式来检测函数签名并生成结构,但我更愿意利用Clang解析器和重写器的功能。)
发布于 2016-07-28 06:27:15
我最后只做了两次通过程序。在第一遍中,我使用了一个null诊断器,这样所有的错误和警告都会被忽略。我收集了一些方法,它们的签名表明需要生成一个结构。在完成第一遍之后,我生成了所有的结构,并通过第二遍运行程序,这一次是使用诊断器。
一般来说,Clang的AST是不可变的,除了纯基于文本的重写之外,它不允许树的修改。但上述方法对我们来说相当有效。如果您对上下文感兴趣,这是IOVisor BCC项目的一部分。
https://stackoverflow.com/questions/38186546
复制相似问题