从Python转换到CIL(C中间语言)

3 投票
1 回答
1330 浏览
提问于 2025-04-16 16:19

最近我在研究Python源代码的静态分析。我们组里已经有一个用Ocaml写的静态分析工具,专门用于CIL(C中间语言)。我们希望能重复利用这个分析工具,所以理想的做法是把Python代码翻译成CIL。

目前,我使用Python自带的ast模块把Python代码解析成Python的抽象语法树(AST)。然后,我把这个AST转换成C语言的AST。考虑到C语言的AST要转换成CIL的API,而且静态分析工具都是用Ocaml写的,我选择了Ocamllex和Ocamlyacc来把Python的AST解析成C的AST。不过,这里遇到了一些大问题。

首先,ast.dump打印出来的AST表示方式很难识别,这让我的解析器实现起来不太容易。另一方面,我无法用Ocaml访问Python的AST内部结构。即使可以,数据结构和Ocaml也不一样。

我在从Python代码转换到C AST的过程中,是否一开始就选择了错误的方法?有没有其他现成的工具或方法可以满足我的需求?

如果我遗漏了什么,请直接指出来,这对我会有很大帮助。谢谢。

1 个回答

3

我觉得这个方法可能不太行得通。CIL其实就是C语言。要让你的方法奏效,你得把Python完全转成C……但这两种语言的概念差别很大。你打算怎么处理Python的对象?继续执行?动态加载?运行时类型?无限精度的数学运算?我觉得你面临的问题不是抽象语法树,而是概念上的问题。

如果你真的能转成CIL,那你又会遇到一个新问题。分析器在需要找到的结构容易被识别时更容易构建。一旦你把继续执行转成C,理解继续执行之间的互动就会变得困难,因为它们不容易被识别。

我觉得我会把精力放在构建一个Python静态分析器上,让Python的概念更容易被检测到。

撰写回答