【静态分析】静态分析笔记08 - 指针分析 - 上下文敏感

参考:

【课程笔记】南大软件分析课程8——指针分析-上下文敏感(课时11/12) - 简书

-------------------------------------------------------------------------------------------------------------

1. 上下文不敏感的问题

说明:上下文敏感分析是对指针分析的准确性提升最有效的技术。

(1)问题

问题:上下文不敏感时,分析常量传播这个问题,由于没有明确调用id()的上下文,会把不同的调用混合在一起,对id函数内的变量n只有一种表示(没有对局部变量进行区分),导致n指向的对象集合增大,将i识别为非常量NAC。实际上,x.get()的值只来自于One()对象,i应该是常量1。

解决:根据调用的上下文(主要有3种:如根据调用点所在的行数——call-site sensitivity)来区分局部变量。

(2)上下文敏感分析

概念

  • call-site sensitivity (call-string):根据调用点位置的不同来区分上下文。

  • Cloning-Based Context Sensitivity:每种上下文对应一个节点(克隆一次数据)。克隆多少数据,后面会讨论。

Context-Sensitive Heap:面向对象程序(如Java)会频繁修改堆对象,所以不仅要给变量加上下文,也要给堆抽象加上下文,称为heap context。

堆抽象上下文示例

堆抽象上下文不敏感:如果不区分8 X x = new X();调用的堆抽象的上下文,导致只有1个o8,把两个上下文调用产生的o8.f指向集合都合并了,得出了o8.f的多余指向的结果。

堆抽象上下文敏感:用不同的调用者来区分堆抽象,如3:o84:o8是不同的堆抽象。所以说,既要根据上下文的不同来区分局部变量,也要区分堆抽象,例如:3:p是给变量加上下文,3:o8是给堆抽象加上下文。

2. Context Sensitive Pointer Analysis:Rules

标记:根据调用者的行数来区分不同上下文。

C—上下文(暂时用调用点的行数表示),O—对象,F—对象中的域。

规则

call指令规则

  • 上下文对于Dispatch(oi, k)(找目标函数)没有影响,根据oi指向和函数签名k找到目标函数。
  • select(c, l, c':oi, m)根据调用时的信息来给调用目标函数选择上下文(c是调用者的上下文,l是调用者的行号,c':oi是x对象在c'上下文的指向集合,m是目标函数)。
  • ct表示目标函数的上下文(后面会讲如何Select选择上下文)。
  • 传递this变量:ct:mthis
  • 传递参数:ct:mpj
  • 传递返回值:ct:mret

3. Context Sensitive Pointer Analysis:Algorithms

区别:和过程间指针分析相比,仍然分为两个过程,分别是构造PFG和根据PFG传递指向信息。主要区别是添加了上下文。

符号

  • S:可达语句的集合

  • Sm:函数m中的语句

  • RM:可达函数的集合

  • CG:调用图的边

4. Context Sensitivity Variants(上下文的选取)

上下文的选取主要采用3类

  • Call-Site Sensitivity
  • Object Sensitivity
  • Type Sensitivity
  • ...

说明:Select(c,l,c':oi,m),c——调用者上下文,l——调用行,c':oi——接收对象(含堆的上下文信息),m——调用函数。

(1)Call-Site Sensitivity

原理:又称为k-call-site sensitivity / k-CFA,上下文信息为调用行号。1991年Olin Shivers提出。

Select(c,l,c':oi,m) = (l',...,l'', l)

问题:如何限制上下文长度?

解决:k-limiting Context Abstraction。只取最后k个上下文,通常取k<=3。例如,函数的上下文通常取2,堆上下文通常取1。

示例:采用1-Call-Site。

interface Number { int get(); }
class One implements Number { public int get() { return 1; }}
class Two implements Number { public int get() { return 2; }}
1   class C {
2       static void main() {
3           C c = new C();
4           c.m();
5       }
6
7       Number id(Number n) {
8           return n;
9       }
10      void m() {
11          Number n1,n2,x,y;
12          n1 = new One();
13          n2 = new Two();
14          x = this.id(n1);
15          y = this.id(n2);
16          x.get();
17      }
18  }

上下文不敏感vs上下文敏感(1-Call-Site)

(2)Object Sensitivity

原理:针对面向对象语言,用receiver object来表示上下文。对比1层的调用点敏感和对象敏感,时间和准确性上对象敏感显然更优,这是由面向对象语言的特点所确定的。

Select(c,l,c':oi,m) = [oj, ... , ok, oi] (c' = [oj, ... , ok])

示例:选取1-object,最终pt(x)=o3。

对比:对比1-Call-Site1-object上下文,在这个示例中1-object明显更准确。原因是面向对象语言的特性,多态性产生很多继承链,一层一层调用子对象,其中最关键的是receiver objectreceiver object决定了调用者的根源。本例有若采用2-Call-Site就不会出错。

示例2:在本示例中,1-Call-Site明显更准确。因为同一个receiver object用不同参数多次调用了子函数,导致局部变量无法区分。

结论:所以理论上,对象敏感与call site敏感的准确度无法比较。但是对于面向对象语言,对象敏感的准确度要优于call site敏感。

(3)Type Sensitivity

原理:牺牲精度,提高速度。基于创建点所在的类型,是基于对象敏感粗粒度的抽象,精度较低。

Select(c,l,c':oi,m) = [𝑡′,...,𝑡′′,InType(𝑜𝑖)] 其中𝑐′ = [𝑡′, ... , 𝑡′′]

(4)总体对比

精度:object > type > call-site

效率:type > object > call-site

本课老师提出选择上下文的方法,对代码的特点有针对性的选择上下文方法,见A Principled Approach to Selective Context Sensitivity for Pointer Analysis。

课后问题

问题1:流敏感和上下文敏感对变量/堆抽象的表示有什么区别?

  • 上下文敏感:某个变量在不同上下文的指向。
  • 流敏感:比如说程序运行到第4行,在这个位置变量的指向是什么,第20行又指向哪些,以控制流的位置来作为区分度。

问题2:循环展开还是不展开?

本课程分析的是流不敏感,所以不会展开循环。Java分析不需要流敏感,开销太大了,效果不明显。

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

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

相关文章

C# 图像处理 添加水印

方法1&#xff0c;使用自带的画刷进行绘制水印 示例代码 public partial class Form1 : Form{public Form1(){InitializeComponent();}string photoPathstring.Empty;Bitmap image null;private void button1_Click(object sender, EventArgs e) //选择照片{OpenFileDialog d…

【C++】位图

文章目录 1. 位图概念2. 位图的实现3. 位图的应用 1. 位图概念 面试题 给 40 亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这 40 亿个数中。 遍历&#xff0c;时间复杂度 O(N) 排序 O(NlogN)&#xff0c;利用二分查找&…

全志ARM-官方库SDK安装和验证

进入界面&#xff0c;输入以下指令 git clone https://github.com/orangepi-xunlong/wiringOP //下载源码 cd wiringOP //进入文件夹 sudo ./build clean //清除编译信息 sudo ./build …

C++ | Leetcode C++题解之第40题组合总和II

题目&#xff1a; 题解&#xff1a; class Solution { private:vector<pair<int, int>> freq;vector<vector<int>> ans;vector<int> sequence;public:void dfs(int pos, int rest) {if (rest 0) {ans.push_back(sequence);return;}if (pos fr…

前端JS必用工具【js-tool-big-box】,防抖和节流的方法调用学习

这一小节&#xff0c;我们针对前端工具包&#xff08;npm&#xff09;js-tool-big-box的使用做一些讲解&#xff0c;主要是防抖和节流方面的。 目录 前言 1 安装和引入 2 防抖的调用学习 3 节流的调用学习 4 使用方法总结 前言 在前端项目中&#xff0c;经常涉及到防抖…

多数据源注解使用

<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.0</version> </dependency> 1.使用mybatis-plus 如何配置多数据源&#xff0c;application-loc…

vue使用海康控件开发包——浏览器直接查看海康监控画面

1、下载控件开发包 2、安装插件&#xff08;双击/demo/codebase/HCWebSDKPlugin.exe进行安装&#xff09; 3、打开/demo/index.html文件 4、在页面上输入你的海康监控的登录信息进行预览 如果有监控画面则可以进行下面的操作 注意&#xff1a;以下操作都在Vue项目进行 5、复…

静态链接lib库使用

lib库实际上分为两种&#xff0c;一种是静态链接lib库或者叫做静态lib库&#xff0c;另一种叫做动态链接库dll库的lib导入库或称为lib导入库。这两个库是不一样的&#xff0c;很多人都分不清楚&#xff0c;很容易混淆。 第一种是静态lib&#xff0c;包含了所有的代码实现的&am…

android studio集成 百度云推送项目实战 注意事项

onBind errorCode0(成功码) appid8543666(appid后台生成) userId1107752540659249906(用户Id) channelId3723987107990995031 requestId1268411415 1.首先查看应用包名是否一致 2.查看key是否一致 <meta-data android:name“api_key” android:value“KRxGMFpmQkXEgZDGG…

Centos 5 的yum源

背景 有使用较老的Centos 5 系统内部安装软件无法正常报错&#xff0c;是由于系统叫老yum源存在问题 处理方法 更换下述yum源&#xff0c;可以将其他repo源文件备份移动到其他目录&#xff0c;添加下述源后重新测试 [C5.11-base] nameCentOS-5.11 baseurlhttp://vault.c…

Jackson 2.x 系列【31】Spring Boot 集成之字典回写

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 本系列Spring Boot 版本 3.2.4 源码地址&#xff1a;https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 1. 场景描述2. 案例演示2.1 修改枚举2.2 定义注解…

Gitflow实操以及代码审查Pull Request操作

1.背景 之前一直有用过gitflow&#xff0c;但是一直没有归纳技术&#xff0c;另一方面也是每个团队用到的gitflow都不一致。而最近做项目要用gitflow&#xff0c;趁此机会分享一下gitflow的操作。 2.gitflow介绍 用git一直有一个问题&#xff0c;就是怎么保证代码稳定性&…

服务器如何开启远程连接?

服务器开启远程连接是网络管理中一项重要的功能。通过远程连接&#xff0c;用户可以在任何地方远程访问服务器&#xff0c;从而进行管理、维护和监控等操作。远程连接的开启可以为工作提供便利性和效率&#xff0c;但同时也带来了安全风险。确保远程连接的安全性和可靠性是至关…

RPC的介绍和架构发展

RPC概念&#xff1a; RPC是远程过程调用协议&#xff0c;是一种不需要了解底层网络技术&#xff0c;调用远程计算机服务。 RPC框架的组成&#xff1a; 图1 当总项目的数据量、访问量不断提高&#xff0c;就把他分成多个服务&#xff0c;减轻单体机器的压力。分开的ABC服务之…

python高阶函数:zip()

概述与基本用法 zip() 是 Python 内置函数之一&#xff0c;用于将多个可迭代对象打包成一个元组序列&#xff0c;然后返回一个迭代器。它可以接受任意数量的可迭代对象作为参数&#xff0c;并将它们的元素按顺序一一对应地打包成元组。 以下是 zip() 函数的基本用法&#xff…

【前端】vue3树形组件使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、树形组件简介二、树形组件使用三、总结 前言 随着开发语言及人工智能工具的普及&#xff0c;使得越来越多的人学习使用vue前端工具&#xff0c;本文主要介…

iOS - 多线程-GCD-队列组

文章目录 iOS - 多线程-GCD-队列组1. 队列组1.1 基本使用步骤 iOS - 多线程-GCD-队列组 开发过程中&#xff0c;有时候想实现这样的效果 多个任务并发执行所有任务执行完成后&#xff0c;进行下一步处理&#xff08;比如回到主线程刷新UI&#xff09; 1. 队列组 可以使用GC…

npm安装时一直idealTree:npm: sill idealTree buildDeps卡住不动

npm安装时一直idealTree:npm: sill idealTree buildDeps卡住不动 解决步骤&#xff1a; 1.去以下的目录中删掉.npmrc文件&#xff08;只在C:\User.npmrc&#xff09; 2.清除缓存&#xff0c;使用npm cache verify 不要用npm cache clean --force&#xff0c;容易出现npm WAR…

【C++】:构造函数和析构函数

目录 前言一&#xff0c;构造函数1.1 什么是构造函数1.2 构造函数的特性1.3 总结 二&#xff0c;析构函数2.1 什么是析构函数2.2 析构函数的特性2.3 总结 前言 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何…

深度学习中的子空间、线性变换和矩阵概念应用

1.表示子空间 在深度学习中&#xff0c;“不同的表示子空间”通常是指模型通过不同的参数&#xff08;例如权重矩阵&#xff09;将输入数据映射到不同的高维空间&#xff0c;这些空间被称为表示子空间。每个子空间都能够捕获输入数据中不同的特征或模式。以下是一些详细解释&am…