我希望为代码分析开发独立于语言的工具。为了做到这一点,我需要找到一种方法来概括编程语言的语法。我想在源代码和分析器之间开发一个层,以便它可以独立于语言理解源代码。我需要知道这个问题是否有专门的研究领域?有什么建议么?
3 回答
这实际上取决于您要进行的分析类型。如果您想以在源语言上下文中可解释的方式分析代码的“意图”,那么问题可能是不可能的,除非您将自己限制在特定的语言家族(例如 Java、C# 和 C++,但是即使是有限的)。如果您只对基本分析感兴趣,例如构建定义类型和方法/函数的模型,您可以获得更大的灵活性。
如果您对分析低级行为感兴趣,最好的选择可能是分析编译器早期阶段的输出。例如,有许多有用的分析类型,例如数据流分析,可以在 Java 字节码上完成,而与生成它的语言无关。可以对 LLVM 中间代码或 GCC 的中间语言进行类似的分析(事实上,这些编译器都在中间代码或汇编代码级别进行了很多优化,因此无论使用哪种语言都可以进行很多相同的优化正在编译)。
对于静态分析,您需要“通用”操作语义,这与语法完全无关。你很幸运——它确实存在,因为每一种实用的语言最终都会被翻译成实际硬件的语义。
因此,您的 CPU 的汇编程序正是您的“广义语义”。CPU 的操作语义是一个很好的研究课题,如果你深入研究,你会发现大量的论文。
LLVM 的级别足够低,可以涵盖大多数此类语义,同时比真实硬件更紧凑且更易于分析,因此您可以考虑使用类似的中间表示。SSA 表格可以显着简化分析。
但是不要太兴奋——在如此低的级别上进行任何有用的全局分析是非常困难的——通用内存模型将需要太多资源,从而使任何分析在现代硬件上都不现实。
如果您准备严格限制对源语言的选择,您可以更上一层楼,并采用更多可分析的语义。如果你想走这条路,你可能会发现K 框架很有趣。