对源代码、字节码、机器码等执行静态分析需要权衡什么?
在不同级别的代码上执行静态分析有哪些各种权衡?例如,对于Java,为什么有人会对Java源代码与Jasmin代码与Java字节码进行静态分析?选择是否限制或扩展了能够完成的各种类型的分析?选择是否会影响分析的正确性?谢谢。
在不同级别的代码上执行静态分析有哪些各种权衡?例如,对于Java,为什么有人会对Java源代码与Jasmin代码与Java字节码进行静态分析?选择是否限制或扩展了能够完成的各种类型的分析?选择是否会影响分析的正确性?谢谢。
在不同级别的代码上执行静态分析有哪些各种权衡?例如,对于Java,为什么有人会对Java源代码与Java字节码进行静态分析?
从用户的角度来看,我会说,除非你有非常具体的,易于形式化的,要分析的属性(例如纯安全属性)与支持Java源代码的工具一起使用。
从工具开发人员的角度来看,使用一个或另一个级别可能更容易。我在这里介绍我脑海中出现的差异。(请注意,使用编译器和/或体面的反编译器,例如,工具在一个层上运行,并在另一个层上显示结果。
Java源代码的优点:
字节码的优点:
机器代码的优点:
最先进的工具,如Spec#等(C#的形式化方法方言)通常通过专门为形式分析设计的中间语言(Spec#情况下的BoogiePL(在Spec#情况下为neighter MSIL或C#))进行。
选择是否限制或扩展了能够完成的各种类型的分析?
最后...不,不是真的。无论你选择分析哪种(图灵完备)语言,你都面临着相同的基本问题。根据您分析的属性,YMMV。
如果你喜欢正式的方法,并考虑自己实现分析,我怀疑你会找到更好的字节码工具支持。如果您是用户或开发人员,并且想要对自己的代码库执行分析,我怀疑您将从在Java源代码级别运行的工具中受益更多。
选择是否会影响分析的正确性?
取决于你所说的正确性是什么意思。静态分析通常是“防御性的”,因为你不会假设任何你不知道是真的。如果您将注意力限制在声音验证系统上,那么所有这些系统都将是“同样正确的”。
IntelliJ对注释进行了静态分析,例如Javadoc和参数名称,这在字节码中不可用。例如,拼写错误和名称不一致。代码分析可确保您在任何问题的行内都有行号和位置。
分析字节码的好处是它更简单,可能就是您所需要的。您可能有行号,但您没有该职位。你可以分析你没有源代码的编译代码,例如库。