生成程序片段(程序依赖图PDG)

生成程序片段(程序依赖图PDG)

生成程序片段
标准方法是:
基于依赖性分析的切片。
使用程序依赖图表示依赖。
从中生成切片。
我们将专注于这种方法。但是,还有其他选择。

程序依赖图 The Program Dependence Graph (PDG)
表示数据和控制依赖项:一些元素已经从数据流测试中看到。
它可以作为构建切片的基础。PDG 可能构成其他分析的基础
注意:这是程序内的,如果我们需要扩展它处理多个过程或方法(获取系统依赖关系图)。 我们不会看这个。

PDG 是一个有向图,其中:顶点代表语句(例如赋值和
控制谓词), 有一个唯一的起始节点, 边代表控制和数据依赖
注意:我们假设我们只处理“结构化”语言,我们不会考虑指针。

PDG的控制依赖
每个控制依赖边都有标签 true 或 false。
控制依赖边 n1 -> n2 表示:
如果 n1 被执行并取边上的值(真或假),则 n2 必须在稍后的某个时间被执行。
如果 n1 被执行并且没有取边上的值,n2 可能永远不会执行。
在这里插入图片描述

假设我们有一个 if 语句,其谓词 p 由节点 n1 表示。
假设其 then 和 else 部分分别对应节点 n2 和 n3。
从 n1 到 n2 有一个控制边,标签为 true。
从 n1 到 n3 有一条控制边,标签为 false。

在这里插入图片描述

假设我们有一个 while 循环,其谓词 p 由节点 n1 表示。
从 节点1到节点3存在控制依赖性(标签为true)。

数据依赖Data Dependence
有两种类型的数据依赖边:
流依赖边
无序依赖边def-order dependence edges
对于切片,我们不需要 def-order 边,也不会包括他们。

流依赖边Flow Dependence Edges
如果满足以下条件,则存在从 n1 到 n2 的流依赖边:
n1 表示对变量 x 的一些赋值; n2 引用 x 的值; 对于 x,从 n1 到 n2 有一个明确的路径定义。
注意:如果它们在循环中,定义清晰的路径可能从一个顶点到一个“较早”的顶点。
在这里插入图片描述
在这里插入图片描述
语句3和语句1之间存在依赖关系,语句3和语句2之间也存在依赖关系。

语句 3 对语句 1 的依赖性是因为变量 x 的值在语句 3 中被修改 (x = x - 1),并且该修改后的值被用于语句 1 中 while 循环的条件表达式中 (while (x > 0)). 语句 3 中 x 的更新会影响语句 1 中的循环条件。
同样,语句 3 与语句 2 之间存在依赖关系。语句 3 中 x 的更新值 (x = x - 1) 用于计算语句 2 中的 y (y = y + x)。

examples:
在这里插入图片描述
second example:
在这里插入图片描述
third example:
在这里插入图片描述
让我们分析具有给定初始值的代码片段:
x = 2, y = 5

  1. 输入语句取x和y的初始值。

  2. while 循环检查 x 是否大于 0 (x > 0)。 在这种情况下,因为 x 是 2,所以条件为真,程序继续执行下一条语句。

  3. if 语句比较 x 和 y。 这里,x 为 2,y 为 5。由于 x 不大于 y,程序执行 else 块。

  4. 在 else 块中,y 减 1 (y = y - 1)。 因为 y 最初是 5,所以 y 变成了 4。

  5. if-else 块执行后,x 减 1 (x = x - 1)。 x 最初为 2,因此 x 变为 1。

  6. 程序回到 while 循环并检查 x 是否大于 0。由于 x 仍然大于 0 (x = 1),循环继续。

  7. 再次执行if语句,比较x和y。 在这种情况下,x (1) 不大于 y (4),因此执行 else 块。

  8. 在 else 块中,y 减 1 (y = y - 1)。 因为 y 是 4,所以 y 变成了 3。

  9. x 减 1 (x = x - 1)。 x 为 1,所以 x 变为 0。

  10. 程序回到 while 循环。 这次,x 不大于 0 (x = 0),因此循环终止。

  11. 最后执行输出语句,输出y的值。 在这种情况下,y 为 3。

因此,对于给定的初始值 x = 2 和 y = 5,代码片段的输出将为 3。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《深入理解计算机系统(CSAPP)》第7章 链接 - 学习笔记

写在前面的话:此系列文章为笔者学习CSAPP时的个人笔记,分享出来与大家学习交流,目录大体与《深入理解计算机系统》书本一致。因是初次预习时写的笔记,在复习回看时发现部分内容存在一些小问题,因时间紧张来不及再次整理…

java单元测试( Hamcrest 断言)

java单元测试( Hamcrest 断言) 单元测试特征: 1 范围狭窄 2 限于单一类或方法 3 体积小 为什么要编写单元测试? 为了防止错误(很明显!) 而且还可以提高开发人员的生产力,因为单元测试: (1) 帮助实施——在…

力扣sql中等篇练习(二十八)

力扣sql中等篇练习(二十八) 1 每个城市最高气温的第一天 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # Write your MySQL query statement below SELECT w.city_id,MIN(w.day) day,w.degree FROM Weather w INNER JOIN (SELECT city_id,MAX(degr…

【算法学习系列】07 - 无序数组中的局部最小值问题

文章目录 说明约束条件简单说下思路解决方案随机无序数组样本生成器算法实现验证代码进行大样本随机测试验证算法正确性 说明 在算法中,局部最小值是指一个函数在一个局部范围内的最小值。 具体而言,如果一个函数在一个小区间内的取值都比该区间内的其他…

C++程序员的待遇怎么样?我来谈谈学好C++的五个关键点

有个学弟跟我谈到这样一个问题:现在我看到网上很多人都在讲,说这个做C程序员,尤其是本科毕业计算机专业,然后步入社会之后就能拿到月入过万。但是为什么自己找的这个工作啊,普遍在月薪六七千块钱左右,也就是…

利用OpenCV处理图像

OpenCV是非常流行的图像处理库,下面介绍一下其对图像的基本操作。 1. 安装与环境 安装还有点儿复杂的,但百度几篇博客基本能解决,这里就不多说了。 安装好后,要在工程中使用OpenCV的头文件和库,需要在CMakeLists.tx…

码住!IC设计常用工具合集!

芯片设计过程中,选择和使用适合的工具是非常重要的。芯片设计工具通常分为三类:EDA工具、模拟仿真工具和布局工具。 一、EDA工具 EDA工具是芯片设计的核心,它包括原理图绘制、逻辑综合、门级仿真工具和物理版图编辑等,可以帮助设计…

基于springboot+Redis的前后端分离项目(一)-【黑马点评】

🎁🎁资源文件分享 链接:https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA?pwdeh11 提取码:eh11 基于session和redis实现登录 (一)前言(二)导入资源(三)短信…

每日学术速递5.26

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Text2NeRF: Text-Driven 3D Scene Generation with Neural Radiance Fields 标题:Text2NeRF:具有神经辐射场的文本驱动 3D 场景生成 作者:Jingb…

Python程序设计基础:标识符、变量与赋值、输入输出

文章目录 一、标识符二、变量与赋值三、输入输出 一、标识符 Python对每个标识符的命名存在要求: 1、每个标识符必须以字母或下划线“_”开头,后跟字母、数字或下划线的任意序列。根据这个规则,以下都是Python中的合法名称:a&…

史上最全测试开发工具推荐(含自动化、性能、稳定性、抓包)

目录 一、UI自动化测试工具 1. uiautomator2 2. Appium 3. ATX-Test 4. Airtest 5. ATXServer2 6. STF 7. Appetizer 二、APP稳定性测试工具 8. UICrawler 9. Maxim 10. AppCrawler 三、APP性能测试工具 11. SoloPi 12. GT 四、抓包工具 13. AnyProxy 14. mi…

【滤波】设计卡尔曼滤波器

本文主要翻译自rlabbe/Kalman-and-Bayesian-Filters-in-Python的第8章节08-Designing-Kalman-Filters(设计卡尔曼滤波器)。 %matplotlib inline#format the book import book_format book_format.set_style()简介 在上一章节中,我们讨论了教…

【自然语言处理】【大模型】ChatGLM-6B模型结构代码解析(单机版)

ChatGLM-6B模型结构代码解析(单机版) ​ 本文介绍ChatGLM-6B的模型结构,代码来自https://huggingface.co/THUDM/chatglm-6b/blob/main/modeling_chatglm.py。 相关博客 【自然语言处理】【大模型】ChatGLM-6B模型结构代码解析(单机版) 【自然语言处理】【大模型】BL…

枚举_源码_分析

枚举源码分析 前言 这是所有Java语言枚举类型的公共基类。关于枚举的更多信息,包括编译器合成的隐式声明方法的描述,可以在Java的第8.9节中找到™ 语言规范。 请注意,当使用枚举类型作为集合的类型或映射中键的类型时,可以使用专…

斩获阿里offer,这份258页面试宝典也太顶了....

测试三年有余,很多新学到的技术不能再项目中得到实践,同时薪资的涨幅很低,于是萌生了跳槽大厂的想法 但大厂不是那么容易进的,前面惨败字节,为此我辛苦准备了两个月,又从小公司开始面试了半个月有余&#…

最系统的网络安全自学笔记+学习路线(超详细)

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面…

虚拟机类加载机制

目录 1、概述 2、类加载的过程 1、过程总览 2、加载 3、链接-验证 4、链接-准备 5、链接-解析 6、初始化 7、总结 3、类加载的时机 4、类加载器 1、概述 2、类与类加载器 3、三层类加载器 4、双亲委派模型 5、其他加载策略 1、概述 一个Java类会被编译成一个Cl…

游戏封包加密方案解析

当下游戏市场已全面回暖,暑期档临近更将迎来大量新游上线,如此关键节点,游戏厂商应当更加注重游戏安全。 FairGuard发现近期游戏黑灰产攻击角度愈发刁钻,除了常见的内存修改外挂、注入挂,针对游戏封包破解的「脱机挂」…

chatgpt赋能python:Python图片处理教程

Python 图片处理教程 Python 是一种功能强大的编程语言,广泛应用于大量不同的行业和领域。其中之一是图像处理和分析。Python 提供了一个庞大的图像库,其拥有大量的工具和函数。Python 图像库具有高度的可扩展性,可以很容易地将其与其他库集…

Async 使用详解

Spring Boot异步调用Async 在实际开发中,有时候为了及时处理请求和进行响应,我们可能会多任务同时执行,或者先处理主任务,也就是异步调用,异步调用的实现有很多,例如多线程、定时任务、消息队列等&#xf…