热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用stackmap框架以及它如何帮助进行字节码验证?

如何解决《使用stackmap框架以及它如何帮助进行字节码验证?》经验,为你挑选了1个好方法。

我一直试图绕过模糊的堆栈映射框架,它只是在一次通过中验证动态加载的类.

很少有堆栈溢出答案和其他资源,我发现非常有用

    堆栈映射帧有更好的解释吗?

    什么样的Java代码需要stackmap框架?

    http://chrononsystems.com/blog/java-7-design-flaw-leads-to-huge-backward-step-for-the-jvm

我理解以下内容 -

    每个基本块都应以堆栈映射帧开始.

    紧跟在无条件分支之后的每条指令(它是基本块的开始)应该具有堆栈映射帧.

    通过ASM创建堆栈映射帧的算法.ASM文档的第3.5节

所有这些文章的缺点在于它没有描述在验证中如何使用堆栈映射框.

更具体地说 - 假设我们有一个如下所述的字节码.在当前位置,操作数堆栈将为空,并且局部变量1的类型将为B.位置L0具有关联的堆栈映射帧.验证者如何使用此信息?

    
    GETSTATIC B.VALUE
    ASTORE 1 
    GOTO L0 <- Current location
    
L1  GETSTATIC A.VALUE
    ASTORE 1
    
L0  ILOAD 0
    IFNE L1
    
    ALOAD 1
    ARETURN

注意:请注意,我确实阅读了JVM规范并且很难理解堆栈映射框架.任何帮助都会非常有帮助.



1> Antimony..:

在字节码中的每一点,本地和操作数堆栈中的每个项都有一个隐式类型.在旧系统下,验证程序按原样计算这些类型,但是如果控制流向后移动,则可能会改变目标的类型,这意味着它必须迭代直到收敛.

现在,在这样的跳转目标上明确指定了类型.验证器通过字节码进行单个线性传递.每当它到达堆栈帧时,它断言当前推断的类型与堆栈帧中的显式类型兼容,然后使用堆栈帧类型继续.每当它跳转时,它断言跳转目标处的堆栈帧具有与当前推断类型兼容的类型.

本质上,堆栈帧明确地存储"迭代到收敛"的结果,这意味着验证者只是检查结果是否正确,而不是计算它们,这可以在一次通过中完成.

除此之外,不允许较新的类文件使用jsrret指令,这使得验证变得更加容易.

作为一个具体示例,假设您有类似以下的代码

.method static foo : ()V
L0: aconst_null
L1: astore_0
L2: new Foo
L3: dup
L4: invokespecial Method Foo  ()V
L5: astore_0
L6: goto L2
.end method

在推理验证下,verfier最初会在L2处将var 0的类型推断为NULL.一旦达到L6,它必须返回并将类型更改为Foo.

在堆栈映射验证下,验证器将再次在L2处初始推断var 0的类型为NULL.但是,它看到L2处有一个堆栈帧,并检查堆栈帧中0的类型.无论它是什么,它将0设置为该类型并继续检查.当它到达L6时,它查看跳转目标的堆栈帧(L2),并断言L6(即Foo)的0类型可分配给L2的0类型(在堆栈中指定) L2的框架.

假设L2处的堆栈帧声明0具有Object类型.然后,堆栈映射验证程序在每个步骤推断出以下类型

L0: INVALID (unset)
L1: INVALID (unset)
L2: NULL
(checks stack frame at L2)
(assert that NULL is assignable to Object)
L2: Object
L3: Object
L4: Object
L5: Object
L6: Foo
(check stack frame at L2)
(assert that Foo is assignable to Object)


推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 如何解决《错误:代码太大》经验,求大佬解答? ... [详细]
  • 如何解决《何时何地在Java源代码中初始化/存储String?》经验,如何解决这个问题? ... [详细]
  • 如何解决《错误的堆栈大小由ASM库计算》经验,为你挑选了1个好方法。 ... [详细]
  • 本文详细介绍了如何解决Uploadify插件在Internet Explorer(IE)9和10版本中遇到的点击失效及JQuery运行时错误问题。通过修改相关JavaScript代码,确保上传功能在不同浏览器环境中的一致性和稳定性。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
author-avatar
鹏63213
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有