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

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

平台: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 会自动优先选择字节码进行分析,因此你只需将代码编译成字节码并放在同一路径下,然后用同样的参数进行分析即可。

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

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

相关文章

java的总结

由于最近已经开始做项目了&#xff0c;所以对java的基础知识的学习都是一个离散化的状态没有一个很系统的学习&#xff0c;都是哪里不会就去学哪里。 先来讲一下前后端的区别吧 在我的理解前端就是&#xff1a;客户端在前端进行点击输入数据&#xff0c;前端将这些数据整合起来…

AI智能体技术突破:引领科技新浪潮

AI智能体技术突破&#xff1a;引领科技新浪潮 基于大模型的 AI Agent 工作流基于大模型的 AI Agent 工作流效果AI Agent 的四种设计模式Reflection 反思设计模式Tool use 工具使用设计模式Planning 规划设计模式Multiagent collaboration 多智能体协作设计模式 吴恩达在红杉美国…

Flink CDC在阿里云DataWorks数据集成应用实践

摘要&#xff1a;本文整理自阿里云 DataWorks 数据集成团队的高级技术专家 王明亚&#xff08;云时&#xff09;老师在 Flink Forward Asia 2023 中数据集成专场的分享。内容主要为以下四部分&#xff1a; 阿里云 DataWorks 数据集成介绍基于 Flink CDC 数据集成新版引擎架构和…

AGI来了?特拉斯用大模型帮助自动驾驶

Elon Musk 的 xAI 刚刚推出了Grok-1.5 Vision&#xff0c;这是对开源模型的多模式升级&#xff0c;允许处理视觉信息。 细节&#xff1a; Grok 1.5V 现在可以处理文档、图表、屏幕截图和照片等视觉信息&#xff0c;重点是对现实世界的理解。 xAI 创建了一个新的“RealWorldQA”…

学习java第四十五天

Spring框架中有哪些不同类型的事件&#xff1f; 上下文更新事件&#xff08;ContextRefreshedEvent&#xff09;&#xff1a;在调用ConfigurableApplicationContext 接口中的refresh()方法时被触发。 上下文开始事件&#xff08;ContextStartedEvent&#xff09;&#xff1a;…

【鸿蒙开发】生命周期

1. UIAbility组件生命周期 UIAbility的生命周期包括Create、Foreground、Background、Destroy四个状态。 UIAbility生命周期状态 1.1 Create状态 Create状态为在应用加载过程中&#xff0c;UIAbility实例创建完成时触发&#xff0c;系统会调用onCreate()回调。可以在该回调中…

会议室预约小程序开源版开发

会议室预约小程序开源版开发 支持设置免费预约和付费预约、积分兑换商城、积分签到等 会议室类目&#xff0c;提供多种类型和设施的会议室选择&#xff0c;满足不同会议需求。 预约日历&#xff0c;展示会议室预约情况&#xff0c;方便用户选择空闲时段。 预约记录&#xff0…

秋招复习笔记——八股文部分:网络基础

TCP/IP 网络模型 应用层 最上层的&#xff0c;也是我们能直接接触到的就是应用层&#xff08;Application Layer&#xff09;&#xff0c;我们电脑或手机使用的应用软件都是在应用层实现。那么&#xff0c;当两个不同设备的应用需要通信的时候&#xff0c;应用就把应用数据传…

java绘图在ubuntu报错

把JRT网站部署到ubuntu桌面系统上&#xff0c;开始没测试绘图部分功能&#xff0c;只试了连PostGreSql部分正常。后面试了生成位图部分发现报错。 报下面错误&#xff1a; (ColorModel.java:220)\n\tat java.desktop/java.awt.image.BufferedImage.(BufferedImage.java:286)\n…

【云原生数据库:原理与实践】2 -数据库与云原生

2-数据库与云原生 2.1 数据库在云时代的发展 云计算为计算问题提供了一个解决方案&#xff0c;即把信息化需要的基础设施作为一种服务来提供&#xff08;Infrastructure as a Service&#xff0c;IaaS&#xff09;&#xff0c;就像生活领域的水电煤气服务一样&#xff0c;企业…

windows Webrtc +VS2019 (M124)下载编译以及调通测试demo

下载depot tools 设置梯子 git config --global http.proxy 127.0.0.1:10000 git config --global https.proxy 127.0.0.1:10000 下载 $ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git 设置depot_tools目录为环境变量 下载webrtc # 设置系统代…

2024年4月最新版GPT

2024年4月最新版ChatGPT/GPT4, 附上最新的使用教程。 随着人工智能技术的不断发展&#xff0c;ChatGPT和GPT4已经成为了人们日常生活中不可或缺的助手。2024年4月,OpenAI公司推出了最新版本的GPT4,带来了更加强大的功能和更加友好的用户体验。本文将为大家带来最新版GPT4的实用…

微软提供用于测试框架的SDK

微软发布了 MSTest SDK。 MSTest SDK基于 MSBuild Project SDK 系统构建并基于MSTest 运行程序&#xff0c;旨在为开发人员提供更好的使用 Microsoft 单元测试框架 MSTest 进行测试的体验。 微软表示&#xff0c; 4 月 11 日发布的MSTest SDK通过合理的默认设置和灵活的选项使…

安全中级-环境安装(手动nginx以及自动安装php,mysql)

为了方便大家跟bilibili课程&#xff0c;出了第一节环境 bilibili搜凌晨五点的星可以观看相关的教程 一、环境 ubentu 二、nginx手动安装 2.1第一步 wget https://nginx.org/download/nginx-1.24.0.tar.gz 2.2下载好安装包以后解压 tar -zxvf nginx-1.21.6.tar.gz2.3安…

Keepalived+LVS+nginx搭建nginx高可用集群

一、简介 nginx是一款非常优秀的反向代理工具&#xff0c;支持请求分发&#xff0c;负载均衡&#xff0c;以及缓存等等非常实用的功能。在请求处理上&#xff0c;nginx采用的是epoll模型&#xff0c;这是一种基于事件监听的模型&#xff0c;因而其具备非常高效的请求处理效率…

安卓功耗分析

power profiler cpu profilerrecord traces find “System Tracing” in Developer Options in Settingschoose “long tracings” and add the tile to quick settingschoose necessary ones in Categories, such as idle, freq, powerturn on/off tracing between some work,…

IDEA: Unable to resolve table ‘xxx‘

描述&#xff1a; 在 IDEA 连接到数据库后&#xff0c;SQL 语句提示 Unable to resolve table 表名&#xff0c;且其它字段也飘红报错。 解决&#xff1a; 右键点击数据库&#xff0c;选择 Tools -> Manage Shown Schemas... 勾选你所使用的数据库即可&#xff1a; 1、2、3…

ShardingSphere:强大的分布式数据库中间件【图文】

ShardingSphere的诞生 ShardingSphere的结构 Sharding-JDBC :它提供了一个轻量级的 Java 框架&#xff0c;在 Java 的 JDBC 层提供额外的服务。使用客户端直连数据库&#xff0c;以 jar 包形式提供服务&#xff0c;无需额外部署和依赖&#xff0c;可理解为增强版的 JDBC 驱动&…

华为OD-C卷-考勤信息[100分]

题目描述 公司用一个字符串来表示员工的出勤信息 absent:缺勤late:迟到leaveearly:早退present:正常上班现需根据员工出勤信息,判断本次是否能获得出勤奖,能获得出勤奖的条件如下: 缺勤不超过一次;没有连续的迟到/早退;任意连续7次考勤,缺勤/迟到/早退不超过3次。输…

模板小细节与了解STL

1、模板小细节 1、在C中&#xff0c;已经写好了有关swap函数来供我们使用&#xff1a; 2、编译器也会偷懒&#xff0c;除非我们给强制要求&#xff1a; 通过调试我们可以看到&#xff0c;编译器不会主动去找模板&#xff0c;这时候我们要在add后加<>即可让Add使用模板函…