【静态分析】软件分析课程实验-前置准备

课程:南京大学的《软件分析》课程

平台:Tai-e(太阿)实验作业平台

1. 实验概述

Tai-e 是一个分析 Java 程序的静态程序分析框架,相比于已有的知名静态程序分析框架(如 Soot、Wala 等),Tai-e 要易学易用很多。Tai-e 提供精炼的 IR,明晰且易拓展的接口,丰富的程序分析算法,直观易懂的框架结构,以及指导性强的文档等。需要注意的是,Tai-e 分为教学版和科研版两个版本,两个版本虽都易学易用,但侧重有所不同。该套实验作业的设计是基于教学版,相比于科研版,教学版更容易方便学生理解作业题目及实验相关代码,但是由于教学版在很多分析的具体设计上与科研版有所不同,因此它们在分析能力和性能上有较大差距。尽管如此,由于 IR、框架结构、程序表示等诸多方面的一致性,熟悉教学版后会非常容易上手科研版。

老师们在 Tai-e 上设计了八个实验作业用以在实践中加深理解《软件分析》课程中重要且实用的理论知识。这八个作业涵盖多种静态分析技术,包括编译优化(活跃变量分析、常量传播分析、死代码检测),基础程序分析(程序调用图构建、非上下文敏感指针/别名分析、各类经典上下文敏感指针/别名分析),以及程序分析在软件安全性的应用(污点分析)。

实验作业的总览及其关系如下图所示。

课程学习与实验进度的关联:

2. Tai-e 框架(教学版)配置指南

目前,Tai-e 利用 Soot 前端解析 Java 程序并帮助构建 Tai-e IR。Soot 有两个前端,分别处理 Java 源代码文件(.java)和字节码文件(.class)。其中,前者可以将源代码中的变量名保留至 IR 中,从而使得生成的 IR 更贴近源码,比后者的更易于理解。因此,在实验作业中,测试用例(即待分析的程序)都以 Java 源文件的格式提供。然而,Soot 的 Java 源文件前端已经过时(只对最高 Java 7 版本提供部分支持)且不够健壮。与之相比,尽管 Soot 的字节码文件前端不能保持原先的变量名,但它更加健壮(对最高 Java 17 版本编译生成的 .class 文件都提供支持)。因此,分析真实世界的程序时,Tai-e 往往分析字节码。

0 下载实验作业

将 Tai-e 实验作业的 GitHub 仓库 Tai-e-Assignments 克隆到本地即可,该仓库包含所有作业所需的代码及其依赖。

1 实验作业内容

Tai-e 实验作业仓库下有多个子目录,包含各个作业对应的 Tai-e 项目(如 A1/tai-e/ 对应作业 1 的 Tai-e 项目)。Tai-e 利用 Gradle 构建,并符合一般 Gradle 项目的结构,所有实验作业项目都具有如下结构:

  • build.gradle.ktsgradlewgradlew.batgradle/:Gradle 脚本和 Tai-e 项目配置文件。
  • src/main/java:Tai-e 源代码文件夹。你需要修改该文件夹中的文件以完成作业。
  • src/test/java:运行测试用例所需的测试驱动程序(test drivers)所在文件夹。
  • src/test/resources:测试用例(待分析的程序)文件夹。
  • lib/:包含 Tai-e 类的文件夹。
  • plan.yml:Tai-e 配置文件,设定了作业中需要执行的分析。
  • COPYING, COPYING.LESSER:Tai-e 许可文件。

2 配置步骤

Tai-e 使用纯 Java 开发,因而可以在大部分主流操作系统上运行,如 Windows,Linux,MacOS。构建和运行 Tai-e 需要安装 Java 17。

若非使用 IntelliJ IDEA,也可以在https://jdk.java.net/17/这里下载。

利用 Gradle 构建脚本,可以很容易地以如下方式将 Tai-e 导入至 IntelliJ IDEA。

步骤 1

从 JetBrains 官网 下载 IntelliJ IDEA 并安装(其中 Windows 和 MacOS 版本提供了安装器,Linux 版本则提供了大部分发行版解压后即可运行的压缩包)。建议安装较新版本的 IntelliJ IDEA(2021.3 或更新版本)从而获得更佳的 Java 17 支持。

你可能疑惑:没有 Java 运行环境如何能运行 IntelliJ IDEA?实际上 IntelliJ IDEA 内置了一份 JRE,供其内部使用。

我们接下来介绍导入作业 1(对应 Tai-e 实验作业仓库下的 A1/tai-e/)的步骤,导入其它作业的步骤与之完全一样。

步骤 2

打开项目。

选择 A1/tai-e/ 文件夹,点击 “OK”。

步骤 3

IntelliJ IDEA 可能会弹出下图窗口询问你是否信任该 Gradle 项目。点击 “Trust Project” 信任该项目(别担心,Tai-e 是可信的😊)。

这样导入操作就完成了。你可能需要等待一段时间以导入 Tai-e(可能需要挂梯子载依赖)。之后,tai-e/ 文件夹中会生成一些与 Gradle 相关的文件和文件夹,你可以忽略它们。

步骤 4

打开 File > Project Structure…,展开 “SDK” 下拉菜单,选择 Add SDK > Download JDK… ,在弹出的窗口中选择 Version 为 17,Vendor 任意,Location 选择安装位置,一般保持默认即可,点击 Download 开始后台下载。

然后展开 “Language level”,选择 "SDK default (17 - Sealed types, always-strict floating-point semantics)"。

步骤 5 (可选)

由于 Tai-e 是一个 Gradle 项目,IntelliJ IDEA 默认使用 Gradle 构建并运行它,这使得构建较慢且总会输出一些烦人的 Gradle 信息:

为解决这些问题,可以使用 IntelliJ IDEA 而非 Gradle 来构建和运行 Tai-e。打开 File > Settings,将 Build and run 设置中的构建和运行工具从 Gradle 改为 IntelliJ IDEA,如下图:

或者,如果你(真的)想用命令行构建 Tai-e,你可以 cdtai-e/ 文件夹下,并使用 Gradle 构建:

$ gradlew compileJava

完成以上步骤后,一个 Tai-e 框架(教学版)的环境配置就完成了。 ヽ(。◕‿◕。)ノ゚

3 以应用软件的形式运行 Tai-e

我们在 Tai-e 中为实验作业提供了一个特殊的类:

pascal.taie.Assignment

它提供了一种简单的使用方式来分析Java程序:

-cp <CLASS_PATH> -m <CLASS_NAME>

其中,<CLASS_PATH> 是 .class 文件所在文件夹的路径,<CLASS_NAME> 是待分析类的类名。Tai-e 会在路径给定的文件夹中寻找该类。比如,要分析 src/test/resources/dataflow/livevar 中的 Assign.java,首先在 IntelliJ IDEA 中打开 Assignment 的 “Run Configuration”:

然后按下图配置 Program arguments:

Tai-e 分析输入的程序并输出分析结果。不同作业中执行的分析和输出各不相同,我们会在各项目的文档中详细说明。

当然你也可以用 Gradle 运行分析:

$ gradlew run --args="-cp <CLASS_PATH> -m <CLASS_NAME>"

你可以用这一小节介绍的方法来分析你自己编写的 Java 程序,这样有助于你测试自己分析算法的实现、探索分析算法的效用、从而加深对算法的理解。在这个过程中你可能会遇到一些问题。为此,我们把常见的问题和解决方案集中到了 用 Tai-e 框架(教学版)分析自制用例 这一节中以供读者方便查阅。

4 使用 JUnit 测试你的实验作业

为了方便大家测试,我们在 src/test/resources/ 文件夹中准备了一些 Java 类和测试输入。每个类都对应于一个名为 *-expected.txt 的期望测试结果文件。

每个作业会有不同的测试驱动类,测试驱动程序会对 src/test/resources/ 下所有测试用例执行分析,并将其输出与期望结果进行比较。如果实现正确,你会通过测试,否则测试驱动程序会失败并输出期望结果和执行结果的不同之处。

同样,你也可以使用 Gradle 运行测试:

$ gradlew clean test

该命令会清空构建目录,重新构建 Tai-e 并执行测试。

3. 用 Tai-e 框架(教学版)分析自制用例

我们非常鼓励你在完成实验作业的过程中自己写一些类作为测试用例,然后用你实现的分析算法来分析这些类。这既可以帮助你更好地理解分析算法,也对你 debug 很有帮助。下面我们介绍如何用 Tai-e (教学版)分析你写的类、其中可能遇到的问题、以及解决方法。

3.1 如何用 Tai-e 框架分析自己写的测试用例?

假设你写了一个类 A.java 并放在路径 path/to/class/ 下,那么你可以用我们为每个作业提供的 pascal.taie.Assignment 分析你的类,只需给它指定参数 -cp /path/to/class/ -m A 即可。

参数 -m 只能指定一个类,即你写的 Java 程序的主类 (main class),但这并不意味着 Tai-e 只能分析一个类的程序。若该类使用了 -cp 所指定路径下的其它类, Tai-e 也能一并分析。

3.2 遇到前端报出错误或生成的 IR 不符合预期怎么办?

Tai-e 目前利用 Soot 前端解析 Java 程序并辅助构建 Tai-e IR。若你写的类符合 Java 语法,但 Tai-e 分析时抛出 SootFrontendException,或生成的 IR 不符合预期(如缺少了源码中的某些语句),那这极有可能是你的类中使用了一些 Soot 的 Java 前端无法处理的语言特性(该前端最高只能部分支持 Java 7 的特性,且不是十分健壮)。

对于这类问题,最简单的解决方法是用 Java 编译器将你写的类编译成字节码 (.class),然后让 Tai-e 分析 .class 文件,这样 Tai-e 就会借助 Soot 的字节码前端解析程序(注:Soot 的字节码前端虽然更加健壮,但其不能保存源码中的变量名信息,因此生成的相应 IR 可读性会差一些)。

3.3 如何用 Tai-e 框架分析字节码 (.class)?

很简单,与分析 Java 源码的方式一样。假设你编译好的类 A.class 存放在路径 /path/to/class/ 下,则使用 pascal.taie.Assignment 并给予其参数 -cp /path/to/class/ -m A 即可。

若同一路径下同时存在一个类的 Java 源码 (.java) 和字节码 (.class), Tai-e 会自动优先选择字节码进行分析,因此你只需将代码编译成字节码并放在同一路径下,然后用同样的参数进行分析即可。

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

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

相关文章

《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)

1.简介 页面对象模型&#xff08;Page Object Model&#xff09;在Selenium Webdriver自动化测试中使用非常流行和受欢迎&#xff0c;作为自动化测试工程师应该至少听说过POM这个概念。本篇介绍POM的简介&#xff0c;接下来宏哥一步一步告诉你如何在你JavaSelenium3自动化测试…

算法打卡day36

今日任务&#xff1a; 1&#xff09;01背包问题理论基础(卡码网&#xff1a;46. 携带研究材料) 2&#xff09;01背包问题滚动数组(卡码网&#xff1a;46. 携带研究材料) 3&#xff09;416. 分割等和子集 4&#xff09;复习day11 卡码网&#xff1a;46. 携带研究材料 题目链接&…

35、链表-LRU缓存

思路&#xff1a; 首先要了解LRU缓存的原理&#xff0c;首先定下容量&#xff0c;每次get请求和put请求都会把当前元素放最前/后面&#xff0c;如果超过容量那么头部/尾部元素就被移除&#xff0c;所以最近最少使用的元素会被优先移除&#xff0c;保证热点数据持续存在。 不管放…

排序(三)——快速排序(递归以及栈和队列实现非递归)超详细

目录 1.hoare法 2.挖坑法 3.前后指针法 4.快排的非递归 4.1 栈实现快排非递归 4.2 队列实现快排非递归 快排我们之前在学习通讯录的时候就用了&#xff0c;那时候我们知道快排是一个很牛逼的排序算法&#xff0c;那他到底是怎么实现的呢&#xff1f; 1.hoare法 快速排序…

【Redis 神秘大陆】003 数据类型使用场景

三、Redis 数据类型和使用场景 Hash&#xff1a;对象类型的数据&#xff0c;购物车List&#xff1a;队列/栈Set&#xff1a;String类型的无序集合&#xff0c;intset&#xff0c;抽奖、签到、打卡&#xff0c;商品评价标签Sorted Set&#xff1a;存储有序的元素&#xff0c;zip…

六、OpenFeign服务接口调用

一、提问 已经有loadbalancer为什么还要学习OpenFeign? 两个都有道理的话&#xff0c;日常用那个&#xff1f; 二、是什么 OpenFeign是什么 官网翻译 Feign是一个声明性web服务客户端。它使编写web服务客户端变得更容易。使用Feign创建一个接口并对其进行注释。它具有可…

【InternLM 实战营第二期笔记】LMDeploy 量化部署 LLMVLM实战

Huggingface与TurboMind介绍 Huggingface HuggingFace是一个高速发展的社区&#xff0c;包括Meta、Google、Microsoft、Amazon在内的超过5000家组织机构在为HuggingFace开源社区贡献代码、数据集和模型。可以认为是一个针对深度学习模型和数据集的在线托管社区&#xff0c;如…

python 列表对象函数

对象函数必须通过一个对象调用。 列表名.函数名() append() 将某一个元素对象添加在列表的表尾 如果添加的是其他的序列&#xff0c;该序列也会被看成是一个数据对象 count() 统计列表当中 某一个元素出现的次数 extend() 在当前列表中 将传入的其他序列的元素添加在表尾…

【AIGC】AIGC在虚拟数字人中的应用:塑造未来互动体验的革新力量

&#x1f680; &#x1f680; &#x1f680;随着科技的快速发展&#xff0c;AIGC已经成为引领未来的重要力量。其中&#xff0c;AIGC在虚拟数字人领域的应用更是引起了广泛关注。虚拟数字人作为一种先进的数字化表达形式&#xff0c;结合了3D建模、动画技术、人工智能等多种先进…

Kubernetes对象的定义和操作

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d8;相关专栏Rust初阶教程、go语言基础系列、spring教程等&#xff0c;大家有兴趣的可以看一看 &#x1f4d9;Jav…

数据密集型应用系统设计 PDF 电子书(Martin Kleppmann 著)

简介 《数据密集型应用系统设计》全书分为三大部分&#xff1a; 第一部分&#xff0c;主要讨论有关增强数据密集型应用系统所需的若干基本原则。首先开篇第 1 章即瞄准目标&#xff1a;可靠性、可扩展性与可维护性&#xff0c;如何认识这些问题以及如何达成目标。第 2 章我们比…

PHP反序列化命令执行+PHP反序列化POP大链 +PHP反序列化基础

[题目信息]&#xff1a; 题目名称题目难度PHP反序列化命令执行1 [题目考点]&#xff1a; 反序列化命令执行&#xff0c;获取题目flag。[Flag格式]: SangFor{t5euvZ_OB8Jd_h2-}[环境部署]&#xff1a; docker-compose.yml文件或者docker tar原始文件。 docker-compose up …

内外网文件摆渡系统,如何贯通网络两侧被隔断的工作流?

随着业务范围不断扩大&#xff0c;产生的数据体量越来越多&#xff0c;企业会采取网络隔离&#xff0c;对核心数据进行保护。网络隔离主要目的是保护企业内部的敏感数据和系统不受外部网络攻击的风险&#xff0c;可以通过物理或逻辑方式实现&#xff0c;例如使用防火墙、网闸、…

电商技术揭秘二十六:智能库存预警与补货系统(下)

相关系列文章 电商技术揭秘一&#xff1a;电商架构设计与核心技术 电商技术揭秘二&#xff1a;电商平台推荐系统的实现与优化 电商技术揭秘三&#xff1a;电商平台的支付与结算系统 电商技术揭秘四&#xff1a;电商平台的物流管理系统 电商技术揭秘五&#xff1a;电商平台…

我的思考工作流(2024年版)

去年底&#xff0c;我对自己的思考工作流程又做了一些优化和改进&#xff0c;把它变得更为简洁、清晰。 因此&#xff0c;今天我想把它分享给大家&#xff0c;希望能给你一些启发。 我的核心方法论依然是我自己提出的「INKP知识管理法」&#xff08;参见《打开心智》第五章&…

【刷题笔记】第七天

文章目录 [924. 尽量减少恶意软件的传播](https://leetcode.cn/problems/minimize-malware-spread/)方法一&#xff0c;并查集方法二&#xff0c;dfs [GCD and LCM ](https://vjudge.net.cn/problem/HDU-4497#authorKING_LRL) 924. 尽量减少恶意软件的传播 如果移除一个感染节…

电机控制器电路板布局布线参考指导(五)

电机控制器电路板布局布线参考指导&#xff08;五&#xff09;大容量电容和旁路电容的放置 1.大容量电容的放置2.电荷泵电容器3.旁路电容/去耦电容的放置3.1 靠近电源3.2 靠近功率器件3.3 靠近开关电流源3.4 靠近电流感测放大器3.5 靠近稳压器 tips&#xff1a;资料主要来自网络…

环境搭建创建项目_使用DevEco开发工具进行开发_创建项目_认识项目结构---HarmonyOS4.0+鸿蒙NEXT工作笔记001

首先去下载DevEco Studio然后再去安装就可以了 安装下一步下一步非常简单 首先去安装nodejs,可以看到,有两个安装方法,左边是自己安装的制定文件夹就可以了,然后 右边是使用鸿蒙自带的,我们选择第二个 然后我们看这个ohpm其实就跟npm是一个意思,用来管理鸿蒙的包的. 这里我们…

apache配置ssl证书

SSL证书&#xff0c;即安全套接层证书&#xff0c;是一种数字证书&#xff0c;它通过在客户端浏览器和Web服务器之间建立一条加密通道&#xff0c;保证了双方传输信息的安全性。当用户访问一个使用SSL证书保护的网站时&#xff0c;浏览器会显示一个锁形图标&#xff0c;表示连接…

FILE类与IO流

目录 File类的实例化与常用方法 File类的理解 文件路径的表示方式&#xff1a; API的使用 IO流概述与流的分类 I/O流中的是Input/Output的缩写 IO流的分类&#xff08;不同角度&#xff09; Java程序中的IO流涉及40多个&#xff0c;但实际上都是由4个抽象类衍生出来的。 F…