小研究 - Java 指针分析综述(三)

近年来静态程序分析已成为保障软件可靠性、安全性和高效性的关键技术之一. 指针分析作为基 础程序分析技术为静态程序分析提供关于程序的一系列基础信息,例如程序任意变量的指向关系、变量 间的别名关系、程序调用图、堆对象的可达性等. 介绍了 Java 指针分析的重要内容:指针分析算法、上下文 敏感、堆对象抽象、复杂语言特性处理、非全程序指针分析,特别是对近年来指针分析的研究热点选择性 上下文敏感技术进行了梳理和讨论.

目录

3 堆对象抽象

4 复杂语言特性处理

4.1 反 射

4.2 本地代码

4.3 异 常

4.4 invokedynamic 与 Lambda 表达式


3 堆对象抽象

目前,Java 指针分析使用最广泛的堆抽象技术 是创建点抽象(allocation-site abstraction),它用程序中 的每个创建点 i(即对象创建语句,如 i: x = new T()) 表示动态运行时所有由 i 创建出来的对象 .  对 应 Heap()函数(见表 3 与表 5)的定义为 Heap(i) = i. 创 建点抽象具有良好的精度,几乎所有主流 Java 指针 分析框架都支持这种堆抽象.

虽然创建点抽象精度良好,但一些复杂的 Java 程序包含大量的创建点,使用创建点抽象会在指针 分析过程中产生大量对象,造成很大的开销. 主流的 指针分析框架都会提供对一些特定对象按类 型合并的功能,如对于 StringBuilder 或 StringBuffer 类 型的对象、字符串常量等对象,将所有同类型的对象 合并抽象成一个对象. 这些对象在程序中通常有许 多创建点,因此合并这些创建点对应的对象之后可 以对指针分析效率带来一定提升.

复杂的 Java 程序会包含数量巨大的访问路径. 此外,程序中的循环引用理论上可形成数量无限的 访问路径,如语句 x.f = x 可使得 x,x.f,x.f.f,x.f.f.f…都 是有效的访问路径,导致指针分析无法穷举. 因此, 实际使用访问路径时,通常也会采用类似上下文敏 感的 k-limiting 技术,即对访问路径中包含的字段数 量设置一个上限 k,长度超过 k 的访问路径则被合并 到相同前缀的访问路径,例如 k=1 时,x.f*表示所有 以 x.f 开头的访问路径,包括 x.f,x.f.g,x.f.h 等. 由于访 问路径可以在一些情况下方便地做强更新(strong update),因此目前主要是一些流敏感分析使用该技术.

4 复杂语言特性处理
4.1 反 射

Livshits 等人提出借助指针分析解析反射关 键 API(如 Class.forName()、 Class.getMethod())的 字 符串参数进而分析出反射调用的副作用. 具体而言, 该反射分析与指针分析同时运行并互相依赖,在此 过程中,反射关键 API 字符串参数(如图 3 中的 clsName 与 mtdName)的指针集发生变化时,指针分析会触发 反射分析,mtdName 根据指针集中的字符串常量来分 析反射调用的行为,并将其相应的副作用反馈给指 针分析. 然而该分析只能处理反射参数指向字符串 常量的情况,对于其它字符串非常量的情况均无法 分析(唯一例外是 Class.newInstance()的返回值被立即进行向下类型转换(downcasting)这一特定情形,该 技术可以利用类型转换的信息对 Class.newInstance() 的副作用进行推导).

在 Elf 的 基 础 上 , Li 等 人 提 出 集 体 推 导 (collective inference)与懒惰堆建模(lazy heap modeling) 的技术,并形成新的反射分析 Solar. 集体推导在 Elf 的基础上进一步增强了推导能力. 懒惰堆建模用于 分 析 由 反 射 调用 Class.newInstance()或 Constructor. newInstance()创建但具体类型在创建点未知的堆对 象. 对于这类对象,Solar 将其传播到程序中使用它们 的位置,如向下类型转换,或 Method.invoke()、Field. get()、Field.set()的反射调用点等,并更充分地利用 程序中这些位置的类型信息以分析反射创建对象的 具体类型. 此外,Solar 也能识别出分析不准确的反射调用点,因 此可以帮助用户添加轻量级注解就可以满足他们的 在可靠性、分析效率等方面的需求.

4.2 本地代码

Java 是一门运行在虚拟机(Java Virtual Machine) 之上的语言,虚拟机封装了不同平台的功能并支持 一套统一的 Java 语言规范,这使得 Java 程序具有良 好的平台无关性因而可以跨平台执行. 然而,在一些情况下,例如 Java 程序需要直接与底层平台交互或 实现性能攸关的功能时,Java 程序也需要调用能直 接运行在宿主平台上的代码,即本地代码(通常由 C/C++实现). Java 提供了 native 关键字,用于在 Java 程序中声明本地方法(native method),例如 java.lang.

System 中的 arraycopy()方法:

class System { …public static native void arraycopy(Object src,int srcPos, Object dest, int destPos, int length);… }

具体来说 , JNI[71] 提供了一系列用于回 调 Java 方 法 的 API, 并且与具体回调的 Java 方法的签名紧密相 关,进而在该工作中提出扫描本地代码中的字符串常量,记录 JNI 调用的参数与字符串常量的对应关系, 结合传统 Java 分析工具对方法签名的分析,推断该 JNI 调用回调的是哪个 Java 方法. 实验结果表明,该工作可以快速有效地推测出 XCorpus 基准程序库和 Chrome 等真实应用中本地代码的回调方法.

4.3 异 常

异常(exception)是 Java 程序中重要而不可忽视 的控制流 . 准确的异常分析需要得知程序的 throw 语句以及方法调用可能抛出异常的具体类型,这需 要依赖于指针分析的结果,反之,异常分析的结果 也能影响指针分析,下面用图 4 中的代码片段进行 说明.

针对指针分析与异常分析相互耦合的特点 , Bravenboer 等人提出将指针分析与异常分析结合 进行的技术. 具体而言,异常分析处理 throw e 语句时 使用指针分析对于变量 e 的结果;而异常分析处理 catch 语句时,会推断哪些异常对象被对应的 catch 语 句捕获,并将捕获的异常对象注入到对应 catch 语句 的异常形参变量的指针集中,反馈给指针分析. 此外, 指针分析在构建调用图时,也会触发异常分析,使其 能够沿着调用边向调用点传播目标方法内没有被捕 获的异常. 通过文献 的方式,实现了指针分析与 异常分析的协同式迭代计算. 实验显示,与以往不精 确的异常分析相比,该技术对于 try-catch 异常对象 流的分析精度有显著提升.

4.4 invokedynamic 与 Lambda 表达式

Soot是目前最流行的 Java 分析框架之一,它 选择在前端生成中间代码的过程中将程序内与 Lambda 表达式相关的 invokedynamic 指令转换为非 invokedynamic 的调用语句,从而避免分析invokedynamic 指令. 然而这种方式损失了一部分原程序中的语义, 并且 Soot 的指针分析也不支持对于 invokedynamic 指 令的分析.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/1273.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Docker】LXC所实现的隔离性、Linux Namespace等讲解

前言 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 📕作者简介:热…

volume 、namespace

顺带说一下 volume 和 namespace ,咱们就开始分享一下 service 是什么 volume 是什么 还记得 docker 的 volume 吗,是一个数据卷 在 K8S 中,volume 是 pod 中能够被多个容器访问的共享目录 ,实际上和 docker 是一样的 volume 是…

JMeter分布式压测,启动执行机器报错: Port already in use: 1099

Problem creating registry: java.rmi.server.ExportException: Port already in use: 1099; nested exception is: java.net.BindException: Address already in use (Bind failed) 当压测量大的时候我们有时候会失败,然后再接着压测,这样就容易造成端口…

Tauri:跨平台探索之旅

一、简介 Tauri 是一个跨平台 GUI 框架,与 Electron 的思想基本类似。都是属于跨平台技术的解决方案 优缺点快速分析 我们一般会把tauri作为 Electron 的替代方案,electron优点咱们不看,这里就提两个electron比较明显的问题: 安装…

监督学习和无监督学习

文章目录 监督学习和无监督学习监督学习算法包括无监督学习算法包括OpenCV十个子类举例: 监督学习和无监督学习 监督学习和无监督学习是机器学习领域中两种不同的学习范式,它们之间的区别在于数据的标签或标记的可用性以及学习任务的性质。 监督学习&am…

【探索 Kubernetes|作业管理篇 系列 10】Pod 健康检查和恢复机制

前言 大家好,我是秋意零。 上一篇中介绍了,Pod 的服务对象,从而对 Pod 有了更深的理解; 今天的主题是 Pod 健康检查和恢复机制,我们将结束 Pod 的内容。 最近搞了一个扣扣群,旨在技术交流、博客互助&am…

电商数据分析方案和BI强强联合,一站式做分析

搭建一个电商大数据分析平台需要哪些条件?总的来说需要一套满足电商数据分析需求的方案,一个能够提供强大数据计算分析功能和数据可视化图表的平台,比如电商数据分析方案和奥威BI软件这样的组合。 电商数据分析方案BI软件,一站式…

CT-ICP: 带有闭环的实时且灵活鲁棒的LiDAR里程计

文章:CT-ICP: Real-time Elastic LiDAR Odometry with Loop Closure 作者:Pierre Dellenbach, Jean-Emmanuel Deschaud, Bastien Jacquet, and Francois Goulette 编辑:点云PCL 代码: https://github.com/jedeschaud/ct_icp https…

Apache RocketMQ EventBridge:构建下一代事件驱动引擎

作者:沈林 前言 事件驱动,这个词在部分人印象中,它是一个过时的技术——没什么新意。从时间上看,确实也是这样,上世纪 60 年代,事件驱动就已经被正式提出,经常会被在 GUI 编程中。但是在有些人…

印刷企业WMS仓储管理系统解决方案

在数字化转型的浪潮中,印刷企业也积极寻求适合自身发展的解决方案。作为印刷业的重要环节,仓储管理对于提高效率、降低成本至关重要。而印刷企业WMS仓储管理系统的应用,为印刷企业带来了全新的解决方案。 印刷WMS仓储管理系统是一种基于信息技…

区块链生态发展

文章目录 前言以太坊的到来什么是图灵完备?什么是智能合约? 以太坊的应用去中心化应用 DApp代币发行 公有链&联盟链区块链应用总结 前言 前面的区块链文章有介绍区块链的诞生以及底层运行原理, 本文主要介绍一下区块链应用的发展&#x…

34岁上岸,我终于圆了自己的考研梦

​ 大家好,我是独孤风,一位曾经的港口煤炭工人,目前在某国企任大数据负责人,公众号大数据流动的作者。 ​ 虽然告诉自己要平静,但是当接到EMS录取通知书的那一刻,眼眶还是忍不住有些湿润。今年正好是是东北…