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

news2024/11/17 23:35:18

近年来静态程序分析已成为保障软件可靠性、安全性和高效性的关键技术之一. 指针分析作为基 础程序分析技术为静态程序分析提供关于程序的一系列基础信息,例如程序任意变量的指向关系、变量 间的别名关系、程序调用图、堆对象的可达性等. 介绍了 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.coloradmin.cn/o/707125.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序:实名认证登录 [2018年]

1、[微信开发社区]微信支付实名信息小程序授权接口能力(用户获取用户真实姓名,身份证号码) 微信开放社区 2、注意事项 四、接口文档 略。

English Learning - L3 纠音 W8 Lesson7 Ted Living Beyond Limits 2023.06.27 周二

朗读内容: Lesson 7 Day 47 - 51 句子 Ted Living Beyond Limits 3-22

GPT-4 参加2023年高考数学,人工智能对话机器人和人类对决,快谁速度快

ChatGPT从入门到精通,一站式掌握办公自动化/爬虫/数据分析和可视化图表制作 全面AI时代就在转角 道路已经铺好了 “局外人”or“先行者” 就在此刻 等你决定 让ChatGPT帮你高效实现职场办公!行动起来吧。 【点击查看更多知识】ChatGPT从入门到精通&am…

springboot中Thymeleaf模板插入Freemarker模板页面

概述 最近在修改springboot架构的项目,项目之前配置的是Thymeleaf模板, 但是在我新加的功能中,我非常想用Freemarker模板来新加一些页面功能。 看到网上很多其他地方描述,要么用不同的文件后缀来区分(如html文件为Thymeleaf&…

【java 程序设计实训】学生请假管理系统

学生请假管理系统 运行结果学生请假管理系统需求分析GUI 编程事件处理数据库编程部分代码项目结构实体类 Admin.javaLeaveData.javaUserLogin.javaMainWindow.javaTeacherReviewFrame.javaleaveList.java 注:完整内容可下载查看完整报告 运行结果 学生请假管理系统需…

mac配置VScode主题加makefile etc

profile配置: 参考链接:https://www.bilibili.com/video/BV1YW4y1M7uX/?spm_id_from333.999.0.0&vd_sourced75fca5b05d8be06d13cfffd2f4f7ab5 https://code.visualstudio.com/docs/cpp/config-clang-mac vscode profiles如下: {//…

蓝桥杯专题-试题版-【九宫重排】【格子刷油漆】【回文数字】【国王的烦恼】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 👉关于作者 专注于Android/Unity和各种游…

空间曲线的切线和法平面与曲面的切平面和法线

(一)空间曲线的切线和法平面 1. 参数方程的形式 理解和记住如下逻辑: 该两个公式,笔者可以理解但是无法证明。 2. 参数方程外的第二种形式: 此种变换的本质,就是将多元函数转换为参数方程的形式。如此看…

English Learning - L3 作业打卡 Lesson7 Day54 2023.6.29 周四

English Learning - L3 作业打卡 Lesson7 Day54 2023.6.29 周四 引言🍉句1: I daydreamed like I did as a little girl and I imagined myself walking gracefully, helping other people through my journey and snowboarding again.成分划分连读爆破语调 &#x…

Learn Mongodb 可是工具及基本命令的使用 ③

作者 : SYFStrive 博客首页 : HomePage 📜: PHP MYSQL 📌:个人社区(欢迎大佬们加入) 👉:社区链接🔗 📌:觉得文章不错可以点点关注 &#x1f44…

Spark 3.4.0新特性--UI支持存储在RocksDB中

背景 对于Spark来说,目前存储所有的事件信息以及UI所需要的信息都是默认存储在内存中,这在CS中,对于以Spark作为 Server的模式下,会导致OOM,也会导致造成之前作者提交PR:Multi sparkSession should share …

Java泛型详解:为什么使用泛型?如何使用泛型?

Java泛型详解:为什么使用泛型?如何使用泛型? 💘一、为什么使用泛型?💘二、如何使用泛型?💖1. 泛型类的使用:💖2. 泛型方法的使用:💖3.…

什么是ABP?

1、ABP背后的思想——DDD(领域驱动设计) ABP架构: ABP实现了多层架构(领域层,应用层,基础设施层和表示层),以及领域驱动设计(实体,存储库,领域服…

(R)-tert-Bu4-DOTAGA,817562-90-6,(R)-DOTAGA-四叔丁酯,的反应特点及性质研究

​ 规格单位:g |货期:按​照具体的库存进行提供 | 纯度:95% 试剂描述: (R)-tert-Bu4-DOTAGA大环化合物是一种多齿配体,其配位原子位于环的骨架上,大环的配位原子可以是O、N、S、Se、P、As等。有二维的…

C++primer(第五版)第七章(类)

类的基本思想是数据抽象和封装. 数据抽象是一种依赖于接口和实现的分离的编程技术. 封装实现了类的接口和实现的分离. 7.1定义抽象数据类型 定义一个抽象数据类型使用关键字struct或是clas(差别仅在于默认访问权限修饰符). //这是一个简单的类定义 class Student{ …

C++ 结合 opencv读取图片与视频

C 结合 opencv读取图片与视频 文章目录 C 结合 opencv读取图片与视频一、安装opencv二 、配置文件准备2.1 新建立文件夹2.2 .vscode文件下配置文件(1)配置tasks.json文件(1)配置launch.json 三 、src文件下代码编写3.1 图片的读取…

matplotlib设置坐标轴为象限模式

import numpy as np import matplotlib.pyplot as pltx np.linspace(-np.pi, np.pi, 1000) cosy np.cos(x) siny np.sin(x)plt.xlim(min(x), max(x)) plt.ylim(min(cosy), max(cosy)0.5) plt.plot(x, cosy) plt.plot(x, siny) # 设置坐标刻度 plt.xticks([-np.pi, -np.pi/2,…

ubuntu安装python

ubuntu安装python 安装包下载 切换到想要的文件夹:如 cd /usr/local/python3 下载安装包 wget https://www.python.org/ftp/python/3.8.10/Python-3.8.10.tgz 网速慢的话也可以现在本电脑下载tgz文件,然后上传到服务器 第一次上传失败! Py…

SFP3012A-ASEMI代理海矽美快恢复二极管SFP3012A

编辑:ll SFP3012A-ASEMI代理海矽美快恢复二极管SFP3012A 型号:SFP3012A 品牌:MHCHXM(海矽美) 芯片个数:单芯片 封装:TO-247 恢复时间:≤75ns 工作温度:-40C~175C …

JS中的异步与Promise使用

同步与异步 我们知道JS是一个单线程的语言,即在同一时间只能做一件事情。为什么设计为当线程呢。?在早期JS是为了在浏览器中运行,我们可以利用JS来制作一些页面的效果也可以和用户做一些交互。所以设计为单线程也是为了避免复杂度。比如在网…