Java 对源代码、字节码、机器码等执行静态分析的权衡是什么?
在不同级别的代码上执行静态分析的各种权衡是什么?例如,对于Java,为什么会有人对Java源代码、代码和Java字节码执行静态分析?选择是否限制或扩展了可以进行的各种类型的分析?选择是否影响分析的正确性?谢谢 在不同级别的代码上执行静态分析的各种权衡是什么?例如,对于Java,为什么要对Java源代码和Java字节码执行静态分析? 从用户的角度来看,我想说,除非您有非常具体、易于形式化的属性来分析(例如纯安全属性),否则使用支持Java源代码的工具 从工具开发人员的角度来看,使用一个或另一个级别可能更容易。我在这里呈现了我脑海中浮现的差异。(请注意,使用编译器和/或适当的反编译器,例如,一个工具可以在一层上运行,并在另一层上显示结果。) Java源代码的优点:Java 对源代码、字节码、机器码等执行静态分析的权衡是什么?,java,bytecode,static-code-analysis,Java,Bytecode,Static Code Analysis,在不同级别的代码上执行静态分析的各种权衡是什么?例如,对于Java,为什么会有人对Java源代码、代码和Java字节码执行静态分析?选择是否限制或扩展了可以进行的各种类型的分析?选择是否影响分析的正确性?谢谢 在不同级别的代码上执行静态分析的各种权衡是什么?例如,对于Java,为什么要对Java源代码和Java字节码执行静态分析? 从用户的角度来看,我想说,除非您有非常具体、易于形式化的属性来分析(例如纯安全属性),否则使用支持Java源代码的工具 从工具开发人员的角度来看,使用一个或另一个级别
- ,即循环等,而不是任意跳跃。(例如,这使得创建微积分变得更加容易。)
- 您可以在代码中做出更多假设(字节码程序更具表现力)
- 语言规范(字节码指令的语义)要简单得多
- 机器(VM)的更“固定”的规范
- 您可以将分析扩展到遗留代码和库
- 分析允许其他针对JVM的语言(闭包、Scala、JRuby…)
- 不需要可能复杂的解析器
- 您需要验证实际为CPU提供了什么。(如果需要完全验证的链,则无需使用已验证的编译器或已验证的VM。)
这取决于你所说的正确性。静态分析通常是“防御性”的,因为你不认为你不知道的事情是真的。如果您将注意力限制在验证系统上,所有系统都将“同样正确”。IntelliJ对注释进行静态分析,例如字节码中不可用的Javadoc和参数名称。e、 拼写错误和姓名不一致。代码分析确保您在任何问题的行中都有行号和位置 分析字节码的好处是它简单得多,并且可能是您所需要的全部。你可能有行号,但你没有位置。你可以分析你没有源代码的编译代码,例如库 在上执行静态分析的各种权衡是什么 不同级别的代码?例如,对于Java,为什么有人 对Java源代码、Jasmin代码和Java执行静态分析 字节码 这样想吧。如果您从Jasmin或字节码中得到负面结果(表明或暗示负面或有害属性的结果),您会怎么做?您将如何及时且经济高效地解决这一问题
现在考虑对源代码进行静态分析的场景(最有可能是<强>您的<强>源代码或<强> > <强> >的代码返回报告需要处理的负/有害属性< 您是否认为解决映射到源代码的有害方面比处理有害方面(可能类似或相关)更困难,但这次映射到字节码或Jasmin
问题是1)Jasmin被期望是合法字节码的一对一表示,2)字节码是由真正的编译器生成的。字节码中的问题直接映射到源代码中引入的问题的可能性非常小,因为存在一个性能良好的编译器 不管在字节码级别检测到的问题是源代码级别引入的问题还是编译器/环境故障的结果,这些问题通常是不可操作的(sp?)。你通常不能对此采取行动,至少不能直接采取行动 在源代码级别检测到的问题,除此之外,它们是可有效操作的。也就是说,您可以着手解决这些问题(通过推断,可以消除从前者派生的字节码中的任何问题) 有些东西可以在字节码级别上检测到,特别是在打包的上下文中(即打包不必要的库),但几乎不需要在字节码级别上进行验证 除非您从事编译器和语言设计(在本例中是针对VM的),否则为了提高效率和实用性,1)您假设编译器是正确的,2)鉴于JVM的规格说明,您