Tai-e

pascal-labLGPL-3.0活跃维护

面向 Java 和 Android 的静态分析框架,上手门槛低,能构建调用图并做污点分析,适合做代码安全与质量检查。

An easy-to-learn/use static analysis framework for Java and Android

v0.5.4发布于 2026-06-22 12:03 UTC1,830star +1 / 7 天204fork同步于 2026-11-10 05:52 UTC

怎么上手

README 里没有找到可直接复制的安装命令

README 里没有找到可直接复制的安装命令,请到 README 或官方文档查看安装方式。

硬件要求

README 没有说明硬件要求。

下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

这个项目的说明还在生成中,先参考下面「最近发版」和 README。

最近发版

5 个版本v0.5.4
  1. v0.5.5-SNAPSHOTpre-release2026-09-07 · 2026-09-07 02:44 UTC
    查看更新说明

    This is the latest pre-release for version 0.5.5-SNAPSHOT. Details of the changes can be found in the CHANGELOG.md. Please note that this pre-release will be removed once the stable version is officially released, and it may be overridden by newer snapshot versions as they are published.

  2. v0.5.4最新正式版2026-06-22 · 2026-06-22 12:03 UTC

    New Features

    • New frontend for converting input Java programs to Tai-e IR.
      • Integrate our new frontend (OOPSLA'25), which is significantly faster and more reliable than the previous Soot-based frontend.
      • Add option --ssa to enable SSA IR generation.
      • Support parsing Java programs up to Java 25.
      • Preserve source-level variable names in generated Tai-e IR when they are available in bytecode.
      • Add option --jre-dir to specify the JRE directory for the Java library selected by -java.
    • Add Android analysis plugin.
      • Integrate PacDroid (ICSE'25), our pointer-analysis-centric framework for Android apps, into Tai-e's pointer analysis.
      • Add option --android-mode to enable Android mode.
      • Add option --android-jars to specify the Android platform jars required for Android analysis.
      • Model key Android framework semantics, including lifecycle/callback behaviors, inter-component communication (ICC), and other common Android features such as intent extras and asynchronous execution.
    • Add Spring DI and WEC analysis plugin.
      • Add pointer-analysis option spring to enable the built-in Spring Framework analysis plugin.
      • Model Spring dependency injection (DI) by collecting bean definitions from configured annotations, @Bean factory methods, and XML bean configurations.
      • Simulate Spring-managed constructor, field, and method injection, including qualifier/name-based and type-based bean resolution.
      • Collect Spring Web endpoint configurations (WEC) from controller and request-mapping annotations, and add endpoint handlers as entry points with receiver beans and mock parameters.
      • Provide spring-plugin-config.yaml to configure supported DI annotations, XML tags, and WEC annotations.
    • Add backends in pascal.taie.backend for Tai-e IR
      • Add a bytecode backend to convert Tai-e IR into Java bytecode and JAR archives.
      • Add a simple virtual machine to interpret Tai-e IR. This VM is not fully-fledged and is intended mainly for testing purposes.

    Contributors

    We would like to thank the following community members for their contributions to this release: Chenxi Li, Haoran Lin, Tian Tan, Menglong Chen, Zheyu Zhong, Teng Zhang, Jinpeng Wang, yahyachan, Jaic1, YaphetsH, cs-cat, Hengbin Zheng, Yufei Liang.

  3. v0.5.22025-12-31 · 2025-12-31 05:07 UTC
    查看更新说明

    New Features

    • Add format check for command-line arguments.
    • Add performance monitoring (CPU and memory usage) functionality to Monitor.
    • Pointer analysis
      • Add special handling for zero-length arrays to enhance PTA precision.
      • Add may-alias-pair client to count may-alias variable pairs.
      • Model Arrays.copyOf for non-functional arrays for soundness.
      • Model jdk.internal.misc.Unsafe to obtain sound results for ConcurrentHashMap.
      • Improve the performance of Obj.getType() by caching Obj's type.
    • Side-effect analysis
      • Improve SideEffectAnalysis precision using context-sensitive information and more efficient algorithms.
    • Class hierarchy analysis (CHA)
      • Improve CHABuilder precision via resolving callees using the type of the receiver variable.

    Fixes

    • Fix NPE in Zipper-e pre-analysis.
    • Fix the behavior of UnionFindSet.setCount() when used concurrently.
    • Fix the k-value setup for the CustomEntryPoint testcase.
    • Fix ReflectionAnalysis plugin to enable AnnotationModel only for Java 5+.
    • Fix static fields handling in UnsafeModel to prevent invalid instance field access.
    • Fix the missing STATIC modifier of static phantom fields in ClassHierarchyImpl.
    • Fix NPE in Exception Analysis.
    • Fix SideEffectAnalysis incorrect behavior when only-app is false.
    • Fix Mahjong's FieldPointsToGraph by handling non-functional MockObj in PointerAnalysisResultImpl.
    • Fix the detection of jar files in BenchmarkRunner.
    • Fix CHABuilder method resolution for static and special methods.
    • Fix shadowed instance fields in dumped points-to set.
    • Fix missing edges when converting context-sensitive call graph to context-insensitive call graph.
    • Escape special characters in StringLiteral.

    Contributors

    We would like to thank the following community members for their contributions to this release: cs-cat, Jinpeng Wang, FoggyDawn, Zhenyu Yan, RacerZ, Chenxi Li, Teng Zhang, Zhiwei Zhang.

  4. v0.5.12024-12-31 · 2024-12-31 08:02 UTC
    查看更新说明

    New Features

    • Add side-effect analysis.
    • The options --class-path and --app-class-path can be repeated multiple times to specify multiple paths.
    • Pointer analysis
      • Add Plugin.onPhaseFinish().
      • Support specifying multiple method signatures in one @InvokeHandler annotation.
      • Add getInfo() to call graph edges and pointer flow edges.
      • Add pointer analysis assertion mechanism to ease testing.
      • Add pascal.taie.analysis.pta.plugin.util.AnalysisModelPluginand IRModelPlugin to replace original Model and IRModel, provide more convenient interfaces to support @InvokeHandler.
    • Taint analysis
      • Support specifying IndexRef (e.g., index: "0[*]" and index: "0.f") in call sources and parameter sources.
      • Support specifying IndexRef in sinks.
      • Support interactive mode, allowing users to modify the taint configuration file and re-run taint analysis without needing to re-run the whole program analysis.
      • Enhance TFG dumping by adding taint configuration and call site info to Source/Sink node and TaintTransfer edge.
      • Support programmatic taint config provider.
      • Add commonly used taint configurations.
    • Class hierarchy analysis (CHA)
      • Support ignoring call sites that call methods declared in java.lang.Object.
      • Support ignoring call sites whose callees exceed given limit.
    • Signature pattern and matcher
      • Add pascal.taie.language.classes.SignatureMatcher which supports retrieving classes, methods, or fields whose signature match given pattern.
      • Use signature matcher in taint analysis and @InvokeHandler to simplify signature configuration.

    Breaking Changes

    • API changes
      • Change Solver.addPFGEdge(Pointer,Pointer,FlowKind,Type) and Solver.addPFGEdge(Pointer,Pointer,FlowKind,Transfer) to Solver.addPFGEdge(PointerFlowEdge) and related APIs.
      • Deprecate pascal.taie.analysis.pta.plugin.util.Model and IRModel (these two interfaces are currently preserved for compatibility, and will be removed in the future).
      • Change PrimitiveType from enum to an interface and implement it by classes that represent concrete primitive types. Refine the types of certain expressions from PrimitiveType to the concrete primitive types.

    Fixes

    • Fix incorrect classpath argument for the frontend where the -acp option is not being used. This issue is only reproducible when --prepend-JVM (-pp) is set to true.
    • Fix mismatch between number of parameter names and number of actual parameters in JMethod for inner class.
    • Fix option parser, now treat only the first colon as delimiter between a key and a value (before each colon is treated as delimiter).
    • Fix empty log file when running via JAR.

    Contributors

    We would like to thank the following community members for their contributions to the releases (v0.5.1, v0.2.2) of Tai-e: Wangxiz, Chenghang Shi, YaphetsH, GnSight, Zhaohui Wang, cs-cat, Yinning Xiao, Zhiwei Zhang, Hengbin Zheng, Chenxi Zhang.

  5. v0.2.22023-09-23 · 2023-09-23 12:36 UTC
    查看更新说明

    New Features

    • Add option --app-class-path.
    • Add option --keep-results.
    • Add option --output-dir.
    • Add option -wc, --world-cache-mode.
    • Add def-use analysis.
    • Add dominator-finding algorithm.
    • Add generics signature information for Class, Method, and Field.
    • Include documentation source in the repository.
    • Taint analysis
      • Support taint source for arguments of method calls and method parameters.
      • Support taint source for field loads.
      • Support taint sanitization for method parameters.
      • Dump taint flow graph.
      • Support loading multiple taint configuration files.
      • Support taint transfer between variables and instance fields/array elements.
      • Support call-site mode.
    • Pointer analysis
      • Support adding entry points of the program to analyze.
      • Support analysis time limit.
      • Support propagation for values of primitive types.
      • Support hybrid inference-based and log-based reflection analysis.
      • Add Solar reflection analysis (TOSEM'19).
      • Support annotation-based invoke handler registration.
      • Support dumping points-to set in YAML format.

    Breaking Changes

    • Option and configuration changes
      • Change All dump related options. Previously, most dump options require users to specify a path to dump file; now, Tai-e uses fixed path for dump file (the file name is fully fixed, and users can still change dump directory via option --output-dir), so that users only need to specify true or false for all dump options.
      • Rename analysis class-dumper to ir-dumper.
      • Pointer analysis
        • Replace merge-string-constants by distinguish-string-constants.
        • Replace action by dump and expected-file.
      • Taint analysis
        • Require to add kind to source configurations. Previously, the taint analysis only supports one kind of sources, i.e., result of method call. Now, we support more kinds of sources, including argument or result of method call (kind: call), and method parameter (kind: param) , so users need to specify kind of each source. Please see an example.
    • API changes
      • Change pascal.taie.analysis.pta.core.heap.HeapModel.getMockObj(String,...) to HeapModel.getMockObj(Descriptor,...).
      • Change APIs of pascal.util.graph.Edge and its subclasses.
      • Change return type of Exp.getUses() to Set<RValue>.
      • Change return type of Stmt.getUses() to Set<RValue>.

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    Tai-e

    test java maven-central codecov DOI

    ✨News

    • Our paper "When Absence Speaks: A Null-Aware Approach for Taint Analysis" has been accepted by ICSE'27. This work presents a simple yet effective approach for recovering missing taint flows, substantially improving the vulnerability detection capability of Tai-e's general-purpose Java taint analysis.
    • Our paper "Heap Abstraction via Early-Confluent Object Merging for Pointer Analysis" has been accepted by OOPSLA'26. This work presents Valve, a novel heap abstraction technique that significantly accelerates pointer analysis while preserving high precision.
    • Release v0.5.4:
      • Tai-e ships with a new frontend, providing faster and more reliable conversion from Java programs to Tai-e IR.
      • Android app analysis is supported through a PacDroid-powered plugin integrated with pointer analysis.
      • Spring DI and WEC analysis is supported through the Spring analysis plugin.
    • Our paper "Two Approaches to Fast Bytecode Frontend for Static Analysis" has been accepted by OOPSLA'25. This paper presents Tai-e's new bytecode frontend, which is significantly faster and more reliable than existing frontends.
    • Our paper "Pointer Analysis for Database-Backed Applications" has been accepted by PLDI'25. This paper describes an end–to–end pointer analysis for Java database–backed application developed on top of Tai-e.
    • Our paper "PacDroid: A Pointer-Analysis-Centric Framework for Security Vulnerabilities in Android Apps" has been accepted by ICSE'25. This work demonstrates Tai-e's new capability in Android analysis, providing a simple yet effective approach for security analysis of Apps. This work earned the Best Artifact Award🏅.
    • Our paper "Bridge the Islands: Pointer Analysis for Microservice Systems" has been accepted by ISSTA'25. This paper describes the first pointer analysis for Java Microservice systems developed on top of Tai-e.
    • Our paper "Interactive Cross-Language Pointer Analysis for Resolving Native Code in Java Programs" has been accepted by ICSE'25. This is the first cross-language pointer analysis between Java and C. This work won the Distinguished Paper Award🏅.
    • Our paper "Context Sensitivity without Context: A Cut-Shortcut Approach to Fast and Precise Pointer Analysis" has been accepted by PLDI'23. This is the first published research work developed on top of Tai-e.
    • Our paper "Tai-e: A Developer-Friendly Static Analysis Framework for Java by Harnessing the Good Designs of Classics" has been accepted by ISSTA'23. This paper describes the designs for the major components of Tai-e.

    Table of Contents

    What is Tai-e?

    Tai-e (Chinese: 太阿; pronunciation: [ˈtaɪə:]) is a new static analysis framework for Java (please see our ISSTA 2023 paper for details), which features arguably the "best" designs from both the novel ones we proposed and those of classic frameworks such as Soot, WALA, Doop, and SpotBugs. Tai-e is easy-to-learn, easy-to-use, efficient, and highly extensible, allowing you to easily develop new analyses on top of it.

    Currently, Tai-e provides the following major analysis components (and more analyses are on the way):

    • Powerful pointer analysis framework
      • On-the-fly call graph construction
      • Various classic and advanced techniques of heap abstraction and context sensitivity for pointer analysis
      • Extensible analysis plugin system (allows to conveniently develop and add new analyses that interact with pointer analysis)
    • Configurable security analysis
      • Taint analysis, which allows to configure sources, sinks, taint transfers, and sanitizers
      • Detection of various information leakages and injection vulnerabilities
      • Various precision and efficiency tradeoffs (benefit from the pointer analysis framework)
    • Various fundamental/utility analyses
      • Fundamental analyses, e.g., reflection analysis and exception analysis
      • Modern language feature analyses, e.g., lambda and method reference analysis, and invokedynamic analysis
      • Utility tools like analysis timer, constraint checker (for debugging), and various graph dumpers
    • Control/Data-flow analysis framework
      • Control-flow graph construction
      • Classic data-flow analyses, e.g., live variable analysis, constant propagation
      • Your data-flow analyses
    • SpotBugs-like bug detection system
      • Bug detectors, e.g., null pointer detector, incorrect clone() detector
      • Your bug detectors

    Tai-e is developed in Java, and it can run on major operating systems including Windows, Linux, and macOS.

    As a courtesy to the developers, we expect that you please cite the paper from ISSTA 2023 describing the Tai-e framework in your research work:

    Tian Tan and Yue Li. 2023. Tai-e: A Developer-Friendly Static Analysis Framework for Java by Harnessing the Good Designs of Classics. In Proceedings of the 32nd ACM SIGSOFT International Symposium on Software Testing and Analysis (ISSTA '23), July 17–21, 2023, Seattle, WA, USA (pdf, bibtex).

    How to Obtain Runnable Tai-e?

    The recommended way is to download the distribution ZIP from GitHub Releases. The ZIP contains Tai-e, all runtime dependencies, offline documentation, and startup scripts for Windows, Linux, and macOS.

    Alternatively, you might build the latest Tai-e yourself from the source code. This can be simply accomplished via Gradle (be sure that Java 17 (or higher version) is available on your system):

    ./gradlew distZip
    

    The distribution ZIP will be generated in tai-e/build/distributions/. After extracting it, run Tai-e via the startup script:

    # on Linux/macOS
    ./tai-e-<version>/bin/tai-e -h
    # on Windows
    .\tai-e-<version>\bin\tai-e.bat -h
    

    For compatibility with older releases and scripts, Tai-e still provides a legacy all-in-one JAR:

    ./gradlew fatJar
    java -jar build/tai-e-all-<version>.jar -h
    

    How to Include Tai-e in Your Project?

    Tai-e is designed as a standalone tool, but you also have the option to include it in your project as a dependency. It is available on Maven repositories, allowing you to easily integrate it into your Java projects using build tools such as Gradle and Maven. We maintain both stable and latest versions of Tai-e, and here are the corresponding coordinates in Gradle and Maven script formats:

    Stable Version

    For Gradle:

    dependencies {
        implementation("net.pascal-lab:tai-e:0.5.4")
    }
    

    For Maven:

    
    <dependencies>
        <dependency>
            <groupId>net.pascal-lab</groupId>
            <artifactId>tai-e</artifactId>
            <version>0.5.4</version>
        </dependency>
    </dependencies>
    

    Latest Version

    For Gradle:

    repositories {
        mavenCentral()
        maven { url = uri("https://central.sonatype.com/repository/maven-snapshots/") }
    }
    
    dependencies {
        implementation("net.pascal-lab:tai-e:0.5.5-SNAPSHOT")
    }
    

    For Maven:

    <repositories>
        <repository>
            <id>snapshots</id>
            <name>Sonatype snapshot server</name>
            <url>https://central.sonatype.com/repository/maven-snapshots/</url>
        </repository>
    </repositories>
    
    <dependencies>
        <dependency>
            <groupId>net.pascal-lab</groupId>
            <artifactId>tai-e</artifactId>
            <version>0.5.5-SNAPSHOT</version>
        </dependency>
    </dependencies>
    

    You can use these coordinates in your Gradle or Maven scripts to include the desired version of Tai-e in your project.

    Documentation

    Reference Documentation

    We have provided detailed information of Tai-e in the Reference Documentation, which covers various aspects such as Setup in IntelliJ IDEA, Command-Line Options, and Development of New Analysis.

    Please note that the reference documentation mentioned above pertains to the latest version of Tai-e. If you need documentation for a specific stable version, please refer to the Documentation Index. Additionally, the documentation is included within the repository and maintained alongside the source code. You can access the reference documentation for a particular version of Tai-e (in AsciiDoc format) by exploring the docs/en directory, starting from index.adoc. This allows you to access version-specific documentation for Tai-e.

    In addition to the reference documentation, Javadocs for Tai-e are also available as a useful reference resource.

    Changelog

    Since we are actively developing and updating Tai-e, we record the notable changes we made, especially the new features and breaking changes, in CHANGELOG. If you find something wrong after updating Tai-e, maybe you could check CHANGELOG for useful information.

    Tai-e Assignments

    In addition, we have developed an educational version of Tai-e where eight programming assignments are carefully designed for systematically training learners to implement various static analysis techniques to analyze real Java programs. The educational version shares a large amount of code with Tai-e, thus doing the assignments would be a good way to get familiar with Tai-e.