3

最近一直在做 Python 源代码的静态分析。我们组已经有一个用 Ocaml 编写的用于 CIL(C Intermediate Language) 的静态分析器。我们想重用这个分析器,所以我们理想的方法是将 Python 翻译成 CIL。

目前,我使用 Python 内置的 ast 模块将 Python 解析为 Python AST。然后我将 ast.dump 打印的 Python AST 翻译成 C AST。考虑到 C AST 到 CIL API 和静态分析器都是用 Ocaml 编写的。我选择 Ocamllex&Ocamlyacc 将 Python AST 解析为 C AST。但是,也存在一些大问题。

ast.dump 打印的 AST 表示很难识别。这使我的解析器不容易实现。另一方面,我不能使用 Ocaml 来访问 Python ast 内部结构。即使我可以,数据结构也与 Ocaml 不同。

我想知道我最初是否选择了将 Python 代码转换为 C AST 的错误方法?是否有任何其他现有的工具或方法可以满足我的要求?

如果有什么我想念的,请指出这对我有很大帮助。谢谢。

4

1 回答 1

3

我认为这不会很好地工作。CIL 本质上只是 C 语言。为了使您的技巧起作用,您已将 Python完全翻译为 C ......但是这些语言的概念非常不同。你将如何为 Python 对象建模?续集?动态负载?运行时打字?无限精度算术?我认为你的问题不是 AST;相反,它们是概念性的。

如果你翻译成 CIL,你现在就会遇到一个新问题。当分析器需要找到的构造很容易检测到时,分析器就更容易构建。一旦你将延续翻译成 C,推理与延续的交互将很难,因为它们不容易识别。

我想我会花费我的精力尝试构建一个 Python 静态分析器,其中 Python 概念很容易检测到。

于 2011-04-24T03:44:55.040 回答