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

news2024/11/23 3:53:32

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

目录

2 上下文敏感

2.1 上下文敏感指针分析算法

2.2 传统上下文敏感

2.3 选择性上下文敏感


2 上下文敏感

Java 程序中的一个方法在运行时可能被多次调 用,每次被调用时都处于不同的调用上下文(calling context)中,上下文敏感(context sensitivity)技术[30] 就 是研究如何在静态分析(如指针分析)中对动态运行 时的上下文进行建模和分析. 上下文敏感可以区分 同一方法在不同上下文中的数据流,从而减少数据 流的混淆并提升精度. 图 1 用一个例子解释上下文敏 感的思路及其作用.

在图 1 的代码片段中,方法 identity()分别被 foo() 和 bar()调用, foo()调用 identity()时传给其字符串 “foo”作为参数,然后由变量 r1 接收其返回值,显而 易见,运行时变量 r1 指向字符串“foo”. bar()与之类 似,运行时 r2 将指向字符串“bar”. 然而,若使用 1.3 节介绍的上下文非敏感指针分析算法分析这段程序, 则 identity()中的变量 s 会指向{“foo” , “bar” },且这 2 个字符串会传播 给 r1 与 r2, 使 得 r1 与 r2 都指向 {“foo”, “bar”},导致指针分析结果不精确(实际运行 时,r1 或 r2 不指向“bar”或“foo”).

造成图 1 的例子中精度丢失的原因在于方法

 identity()在运行时有 2 个调用上下文(来自 foo()与 bar()),并且 identity()内的变量 s 在 2 个上下文中指 向不同对象(分别为“foo”与“bar”). 然而上下文非敏 感分析并不区分这 2 个上下文,因此 2 个上下文中的 数据流在 identity()内部混淆,并且传递给了 r1 与 r2 . 而上下文敏感分析的思路是将 identity()的不同调用 上下文加以区分并分别分析,从而避免数据流的混 淆以提升精度.

目前,上下文敏感是提升 Java 指针分析精度公 认最有效的方法[20,31-34] ,多年来一直是该领域的研究 重点. 2.1 节将 1.3 节介绍的指针分析算法扩展成上 下文敏感指针分析算法,2.2 节与 2.3 节分别介绍传 统上下文敏感技术以及近年来的相关研究热点,选 择性上下文敏感技术.

2.1 上下文敏感指针分析算法

在上下文敏感指针分析中,程序中的每个方法 会被冠以上下文,用 c:m 表示(c 表示某个上下文), 称为上下文敏感方法. 每个上下文可以被视为一个 标识符,用于将该上下文中的方法(如 c:m)与其它上 下文中的同一方法(如 c′:m)加以区分. 此外,通常每 个方法中的变量与创建出的对象也继承该方法的上 下文,成为上下文敏感变量与对象. 不同上下文中的 变量以及对象的实例字段可指向不同对象,从而达 到实现对不同上下文数据流的区分. 而具体上下文 的生成取决于指针分析使用的上下文敏感技术,本 文在 2.2~2.3 节进行介绍.

表 4 列出了上下文敏感指针分析算法用到的符 号以及相关域. 表 4 与表 2 相比的区别在于,上下文 敏感分析中程序的方法、变量、对象被冠以上下文. 相 应 地 , 指 向 关系 pt 相 关 的 域 , 即 指 针 集 合 (CSPointer)和对象集合中的元素也都带有上下文.

        

1)指针分析规则. 表 5 给出了上下文敏感指针分 析的规则. 假设表中语句所在方法的当前上下文为 c,则相关语句的变量的上下文都是 c,如复制语句的变 量 x 和 y、字段存储语句的变量 x 和 y 等,因为同一语 句的变量必然声明在同一方法内,因此它们具有相 同的上下文. 表 5 给出的分析规则与表 3 的上下文非 敏感指针分析在本质上都可视为 Andersen 风格指针 分析(描述了程序各指针之间如何建立子集约束), 表 5 与表 3 的区别在于上下文敏感分析中的指针都 带有上下文,可以使不同上下文中的指向关系得以 分开分析,从而提升精度.

在上下文敏感指针分析中,方法调用的规则最 为重要和复杂,因为它涉及到上下文的生成. 具体地 说,本文定义 Select(c, l, c':oi)函数,根据调用点的信 息(当前调用者上下文 c,调用点标号 l,接收者对象 c':oi)生成目标方法 m(与表 3 中上下文非敏感分析一 样,由 Dispatch 得到)的上下文 c t . Select()函数的具体 实现对应不同的上下文敏感技术,本文将在 2.2~2.3 节展开讨论. 得到目标方法的上下文 c t 后,指针分析 规则在 c 中 l 的变量与 m 在 c t 中的变量之间互相传递对象. 由于 m 的 c t 是根据调用点的信息生成的,因 此 m 也与当前调用建立了关联,从而可以与 m 的其 它上下文(例如由其它调用点发起的调用)区分开, 从而避免不同上下文数据流混淆造成的精度丢失.

2)指针分析算法. 本文设计的上下文敏感指针 分析算法如算法 2 所示. 该算法是由算法 1(上下文 非敏感指针分析算法)扩展而成,算法的思路仍是构 建指针流图 PFG 用于表达子集约束关系 ,并沿 着 PFG 传播指向关系直至到达不动点. 表 5 的列 4 给出 了添加 PFG 边的规则. 在上下文敏感分析中,PFG 的 结点都是带有上下文的指针. 由于算法 2 的流程与算 法 1 一致,因此本文不再赘述.

2.2 传统上下文敏感

1)调 用 点 敏 感 .  调 用 点 敏 感 (call-site  sensitivity) [30,40-41] ,又称调用串敏感(call-string sensitivity)或 kCFA,是最早诞生的上下文敏感技术. 调用点敏感的 每个上下文由一串调用点组成(具体实现中,通常会 给程序中的每个调用点赋予一个唯一的标号,并用 标号表示相应的调用点),当分析调用点 l 时,调用点 敏感将 l 所在方法的上下文加上 l 自身,作为目标方 法的上下文. 对应的 Select()函数定义为(下划线表 示无关的参数):

Select(c, l, _) = [l ′ , …, l ′′ , l], 其中,c = [l ′ , …, l ′′].

2)对象敏感. 2002 年,Milanova 等人针对面向对象 语言的特征,提出对象敏感(object sensitivity)技术[42-43] . 具体地说,对象敏感技术使用调用点的接收者对象 作为上下文,相应的 Select()函数定义为:

Select(_, _, c ′ : oi) = [oj , …, ok , oi], 其中c ′ = [oj , …, ok].

3)类型敏感. 作为面向对象程序,许多 Java 程序 会创建大量对象,因此使用对象敏感技术分析这类 程序且上下文层数大于 1 时,容易产生过多上下文, 导致指针分析开销过大. 对此,Smaragdakis 等人[44] 在 对象敏感的基础上提出类型敏感(type sensitivity)技 术以提升指针分析效率与可扩展性,对应的 Select() 函数定义为:

Select(_, _, c ′ : oi) = [t, …, t ′ , InT ype(oi)],

其中c ′ = [t, …, t ′ ].

2.3 选择性上下文敏感

1)选择上下文元素. 传统的上下文敏感使用的都是连续的上下文元素,例如,如果是调用点敏感技 术 ,l3 会调用 l2, l2 会调用 l1,那么 [l3 ,l2 ,l1 ] 就会作为 3 层上下文元素来被使用. 然而,Tan 等人[46] 发现连续 上下文中的很多上下文元素在很多情况下并不能提 升精度,而这些上下文元素由于占用了上下文资源, 比如,如果只能用 2 层上下文,那么该例中的 l3 如果 是能够帮助提升精度的上下文元素而 l2 不是,但是 由于传统方法的上下文元素是连续的,因此也只能 舍弃 l3 . 为了解决该问题,Tan 等人[46] 提出了对象分 配图(object allocation graph),并将识别有效上下文元 素的问题转换为在对象分配图上识别有效路径的问 题. 如果使用同样的上下文层数,该方法可以被证明 总能取得相较于传统方法更好的分析精度.

2)选择程序方法. Smaragdakis 等人[50] 为了能够 让指针分析有更好的可扩展性,提出了自省式分析 (introspective analysis),该方法人工选取 6 种不同的 程序指标(metrics)(例如,程序方法参数的指向集合 的大小);通过运行上下文非敏感指针分析作为预分 析将这些指标值算出;根据这些值和阈值的比较作为选择哪些方法需要上下文敏感的判断条件,其余 方法用上下文非敏感来分析,这样会节省计算和维 护上下文信息的开销. 实验数据显示,该方法确实能 够使得一些之前难以分析的程序在合理时间内分析 出结果,且取得了良好的分析精度.

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

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

相关文章

亚马逊云科技积极探索多样化生态合作模式,助力实现可持续发展愿景

2023年6月26日,亚马逊云科技中国峰会在上海世博中心盛大开幕!以主题“因构建 而可见”为大家拉开帷幕。当前,越来越多的企业客户,以及当地政府监管机构对企业的要求,都需要企业告知碳足迹,亚马逊云科技提供…

优盘数据恢复怎么做?3个方法分享!

我的优盘里保存了很多有纪念意义的照片,但是刚刚将u盘插入电脑后,发现有些照片已经损坏了。我想将优盘里的数据恢复,有什么靠谱的方法吗?给我推荐一下吧! 优盘是一种便携式存储设备,常用于存储和传输数据。…

Java-API简析_java.lang.Thread类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/131467981 出自【进步*于辰的博客】 因为我发现目前,我对Java-API的学习意识比较薄弱…

九类AI应用和五个简单LLM的Prompt技巧

一、九类AI应用 AI艺术:造梦日记、MidJourney、Stable Diffusion、Adobe、Stability、Remove AI聊天:ChatGPT、Discord、文心一言、Google Bard、星火、Character.Al AI社区:Kaggle、Hugging Face、H20、Github、Replicate、OpenCV AI创造…

chatgpt赋能python:Python随机打乱列表:如何使用Python打乱您的数据?

Python随机打乱列表:如何使用Python打乱您的数据? 在数据处理中,列表是一种常见的数据结构。然而,当数据量很大时,列表的排序方式也变得重要。为了更好地处理数据,我们需要知道如何使用Python打乱列表。 …

k8s操作命令

系列文章目录 文章目录 系列文章目录一、k8s基础命令1.陈述式资源管理方法:2.基础命令 总结 一、k8s基础命令 1.陈述式资源管理方法: 1.kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 apiserver 的接口 2.kubectl 是官方的CLI命令行工具…

项目——学生信息管理系统2

目录 用户类型,我们创建一个枚举类 在 org.xingyun.model 包下创建 UserType 枚举类 快速生成 get set 方法 修改代码,下拉框的内容,用我们的枚举类型 给登录按钮绑定事件 我们在 org.xingyun.utils 包下创建一个工具类 Eclipse 智能提…

【Java基础】volatile关键字

关于作者:CSDN内容合伙人、技术专家, 从零开始做过日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 目录 一、导读二、概览2.1 作用2.2 多线程共享变量的访问流程2.3 多线…

EMC学习笔记(十二)跨分割区及开槽的处理

跨分割区及开槽的处理 1.开槽的产生1.1 对电源/地平面分割造成的开槽1.2 通孔过于密集形成开槽 2.开槽对PCB板EMC性能的影响2.1 高速信号与低速信号的面电流分布2.2 分地的概念2.3 信号跨越电源平面或地平面上的开槽的问题 3.对开槽的处理3.1 需要严格的阻抗控制的高速信号线&a…

基于Hadoop的豆瓣电影的数据抓取、数据清洗、大数据分析(hdfs、flume、hive、mysql等)、大屏可视化

目录 项目介绍研究背景国内外研究现状分析研究目的研究意义研究总体设计数据获取网络爬虫介绍豆瓣电影数据的采集 数据预处理数据导入及环境配置Flume介绍Hive介绍MySQL介绍Pyecharts介绍环境配置及数据加载 大数据分析及可视化豆瓣影评结构化分析豆瓣电影类型占比分析豆瓣电影…

Vector - CAPL - 常见缩写词

我们在CAPL脚本开发过程中,为了表示的方便,我们会使用大量的缩写词,为了方便自己的使用,大家也可作为参考使用,这里就整理出来一部分常用缩写,以及中英文注释。 CAPL开发中常见缩写 缩写英文解释中文ABSA…

数据安全系列(二)丨数据分类分级

1 数据分类分级的依据 2016年11月,《网络安全法》明确将“数据分类”作为网络安全保护法定义务之一。 2021年9月,《数据安全法》再次具体确立了“数据分类分级保护制度”及其基本原则。 《数据安全法》 第二十一条 国家建立数据分类分级保护制度&am…

Ansible与Shell结合使用

利用Shell脚本运行Ansible命令: 本实验采用rhel8.3。这次将使用 yum_repository 模块远程写入仓库配置。 写入仓库: Shell脚本: #!/bin/bashansible dev -m yum_repository -a namemyBase description"myTestRepo \ baseurl"/m…

物联网的未来:连接万物的智能世界

第一章:引言 在当今数字化时代,物联网(Internet of Things,IoT)已经成为了人们生活中不可或缺的一部分。物联网技术的快速发展和广泛应用,将为我们带来一个连接万物的智能世界。本文将探讨物联网的未来发展…

内核态与用户态详解(嵌入式学习)

内核态与用户态 内核态概念特点和功能 用户态概念特点和功能 内核态与用户态如何切换?总结 内核态 概念 内核态(Kernel Mode)是计算机操作系统中的一种特权级别或运行模式。在内核态下,操作系统拥有最高的权限和访问系统资源的能…

vue-tsc --noEmit导致打包报TS类型错误

🐱 个人主页:不叫猫先生,公众号:前端舵手 🙋‍♂️ 作者简介:2022年度博客之星前端领域TOP 2,前端领域优质作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步…

使用预计算的纹理替换Hololens 2屏幕的内容

需求:自己渲染器生成的纹理是A,Unity里的virtual camera生成的纹理是B,正常情况下眼镜里看到的是B,我想着直接用A替换掉B。 了解Unity渲染脚本的生命周期: 对于我们的需求,关键的是Scene Rendering这一块内…

基于ChatGLM2和langchain的本地知识库问答的实战方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

【C语言】计算机是如何存储整数和小数的?

文章目录 前言一、正整数和0二、负整数三、小数1、定点数(1)什么是定点数(2)表示精度(3)表示范围(4)优缺点 2、浮点数(1)什么是浮点数(2&#xff…

Linux——搭建jdk环境

标题Linux——搭建jdk环境 Linux搭建jdk,案例采用jdk8 1.检查linux位数(64和32位) [rootnode1 /]# getconf LONG_BIT 642.下载对应的linux JDK包,这里使用jdk8 下载jdk8 : 链接: https://www.oracle.com/java/technologies/downloads/#java8 3、上…