我希望为代码分析开发独立于语言的工具。为了做到这一点,我需要找到一种方法来概括编程语言的语法。我想在源代码和分析器之间开发一个层,以便它可以独立于语言理解源代码。 我需要知道这个问题是否有一个特殊的研究领域?有什么建议?
答案 0 :(得分:1)
这实际上取决于您要进行的分析。如果您想以在源语言的上下文中解释的方式分析代码的“意图”,那么除非您将自己限制在特定的语言系列(例如Java,C#和C ++,但是即使这是有限的)。如果您只对基本分析感兴趣,例如,您可以获得更大的灵活性。构建定义类型和方法/函数的模型。
如果您对分析低级行为感兴趣,最好的选择可能是分析编译器早期阶段的输出。例如,有许多有用的分析类型,例如数据流分析,可以在Java字节码上完成,而不管生成它的语言如何。可以对LLVM中间代码或GCC的中间语言进行类似的分析(实际上,这些编译器都在中间代码或汇编代码级别上进行了大量优化,因此无论使用何种语言都可以进行大量相同的优化正在编制中。)
答案 1 :(得分:0)
在我的研究小组中,人们一直致力于一个名为Moose的软件分析平台。因此,他们开发了Famix模型来抽象出特定语言的语法。从特定语言到语言无关模型有各种导入器。
在许多具有不同语法的面向对象编程语言中都有常见的结构,例如:然而,不可能有一个独特的模型来捕获所有语言的所有构造的语义 - 该模型捕获了许多语言共享的常见构造的语义。
答案 2 :(得分:0)
对于静态分析,您需要“通用”操作语义,这与语法完全无关。你很幸运 - 它确实存在,因为每一个实用的语言最终都被翻译成实际硬件的语义。
因此,CPU的汇编程序正是您的“通用语义”。 CPU的操作语义是一个很好的研究课题,如果你深入挖掘,你会发现大量的论文。
LLVM的低级别足以覆盖大多数此类语义,同时比实际硬件更紧凑,更易于分析,因此您可以考虑使用类似的中间表示。 SSA表格可以显着简化分析。
但是不要太兴奋 - 在如此低的水平上进行任何有用的全局分析是非常困难的 - 通用内存模型将需要太多资源,使任何分析在当代都不现实硬件
如果您准备严格限制源语言的选择,您可以提升一个级别,并采用更多可分析的语义。如果你想这样,你可能会发现K framework很有趣。