clang 重写器:将结构定义添加到无效程序
clang rewriter: add structure definitions to invalid program
我需要重写一段 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 的解析器和重写器的强大功能。 )
我最后做的只是通过程序两次。在第一遍中,我使用了一个空诊断器,以便忽略所有错误和警告。我收集了其签名表明需要生成结构的方法。完成第一遍后,我通过第二遍生成了所有结构和 运行 程序,这次是使用诊断程序。
一般来说,Clang 的 AST 是不可变的,除了基于纯文本的重写之外,实际上不允许修改树。但是上面的方法对我们来说效果相当好。如果您对上下文感到好奇,这是 IOVisor BCC project.
的一部分
我需要重写一段 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 的解析器和重写器的强大功能。 )
我最后做的只是通过程序两次。在第一遍中,我使用了一个空诊断器,以便忽略所有错误和警告。我收集了其签名表明需要生成结构的方法。完成第一遍后,我通过第二遍生成了所有结构和 运行 程序,这次是使用诊断程序。
一般来说,Clang 的 AST 是不可变的,除了基于纯文本的重写之外,实际上不允许修改树。但是上面的方法对我们来说效果相当好。如果您对上下文感到好奇,这是 IOVisor BCC project.
的一部分