对源代码、字节码、机器码等执行静态分析需要权衡什么?

2022-09-04 04:19:32

在不同级别的代码上执行静态分析有哪些各种权衡?例如,对于Java,为什么有人会对Java源代码与Jasmin代码与Java字节码进行静态分析?选择是否限制或扩展了能够完成的各种类型的分析?选择是否会影响分析的正确性?谢谢。


答案 1

在不同级别的代码上执行静态分析有哪些各种权衡?例如,对于Java,为什么有人会对Java源代码与Java字节码进行静态分析?

用户的角度来看,我会说,除非你有非常具体的,易于形式化的,要分析的属性(例如纯安全属性)与支持Java源代码的工具一起使用。

从工具开发人员的角度来看,使用一个或另一个级别可能更容易。我在这里介绍我脑海中出现的差异。(请注意,使用编译器和/或体面的反编译器,例如,工具在一个层上运行,并在另一个层上显示结果。

Java源代码的优点:

  • 结构化语言,即循环等,而不是任意跳转。(例如,这使得创建最弱的前提条件演算变得更加容易。
  • 您可以在代码中做出更多假设(字节码程序更具表现力)。

字节码的优点:

  • 语言规范(字节码指令的语义)要简单得多
  • 更“固定”的计算机(VM)规格
  • 可以将分析扩展到旧代码和库。
  • 分析允许针对JVM的其他语言(闭包,Scala,JRuby...)
  • 无需可能复杂的解析器

机器代码的优点:

  • 您验证实际为 CPU 供电的内容。(如果需要完全验证的链,则无需使用已验证的编译器或已验证的 VM。

最先进的工具,如Spec#等(C#的形式化方法方言)通常通过专门为形式分析设计的中间语言(Spec#情况下的BoogiePL(在Spec#情况下为neighter MSIL或C#))进行。

选择是否限制或扩展了能够完成的各种类型的分析?

最后...不,不是真的。无论你选择分析哪种(图灵完备)语言,你都面临着相同的基本问题。根据您分析的属性,YMMV。

如果你喜欢正式的方法,并考虑自己实现分析,我怀疑你会找到更好的字节码工具支持。如果您是用户开发人员,并且想要对自己的代码库执行分析,我怀疑您将从在Java源代码级别运行的工具中受益更多。

选择是否会影响分析的正确性?

取决于你所说的正确性是什么意思。静态分析通常是“防御性的”,因为你不会假设任何你不知道是真的。如果您将注意力限制在声音验证系统上,那么所有这些系统都将是“同样正确的”。


答案 2

IntelliJ对注释进行了静态分析,例如Javadoc和参数名称,这在字节码中不可用。例如,拼写错误和名称不一致。代码分析可确保您在任何问题的行内都有行号和位置。

分析字节码的好处是它更简单,可能就是您所需要的。您可能有行号,但您没有该职位。你可以分析你没有源代码的编译代码,例如库。


推荐