
Простая в изучении/использовании платформа статического анализа для Java и Android
<div align="center">
<img src="https://assets.kitploit.com/production/public/readmes/5723/5e5a1c4adbc35999db283bd6c372430aba581b06159633c846c284a6ef1c91aa.png" height="200">
# Tai-e
[](https://github.com/pascal-lab/Tai-e/actions/workflows/test.yml)
[](https://openjdk.java.net/)
[](https://search.maven.org/artifact/net.pascal-lab/tai-e)
[](https://codecov.io/gh/pascal-lab/Tai-e)
[](https://doi.org/10.1145/3597926.3598120)
</div>
## ✨Новости
- Релиз v0.5.4:
- Tai-e поставляется с новым фронтендом, обеспечивающим более быструю и надежную конвертацию Java-программ в IR Tai-e.
- Анализ Android-приложений поддерживается через плагин на базе PacDroid, интегрированный с анализом указателей.
- Анализ Spring DI и WEC поддерживается через плагин анализа Spring.
- Наша статья _"Two Approaches to Fast Bytecode Frontend for Static Analysis"_ принята на <ins>OOPSLA'25</ins>. В этой статье представлен новый байткодный фронтенд Tai-e, который значительно быстрее и надежнее существующих фронтендов.
- Наша статья _"Pointer Analysis for Database-Backed Applications"_ принята на <ins>PLDI'25</ins>. В этой статье описан сквозной анализ указателей для Java-приложений, работающих с базами данных, разработанный на основе Tai-e.
- Наша статья _"PacDroid: A Pointer-Analysis-Centric Framework for Security Vulnerabilities in Android Apps"_ принята на <ins>ICSE'25</ins>. Эта работа демонстрирует новые возможности Tai-e в анализе Android, предлагая простой, но эффективный подход к анализу безопасности приложений. Эта работа получила **Best Artifact Award**🏅.
- Наша статья _"Bridge the Islands: Pointer Analysis for Microservice Systems"_ принята на <ins>ISSTA'25</ins>. В этой статье описан первый анализ указателей для Java-микросервисных систем, разработанный на основе Tai-e.
- Наша статья _"Interactive Cross-Language Pointer Analysis for Resolving Native Code in Java Programs"_ принята на <ins>ICSE'25</ins>. Это первый межъязыковой анализ указателей между Java и C. Эта работа получила **Distinguished Paper Award**🏅.
- Наша статья _"Context Sensitivity without Context: A Cut-Shortcut Approach to Fast and Precise Pointer Analysis"_ принята на <ins>PLDI'23</ins>. Это первая опубликованная исследовательская работа, разработанная на основе Tai-e.
- Наша статья _"Tai-e: A Developer-Friendly Static Analysis Framework for Java by Harnessing the Good Designs of Classics"_ принята на <ins>ISSTA'23</ins>. В этой статье описываются проекты основных компонентов Tai-e.
## Содержание
- [Что такое Tai-e?](#what-is-tai-e)
- [Как получить работающий Tai-e?](#how-to-obtain-runnable-tai-e)
- [Как включить Tai-e в свой проект?](#how-to-include-tai-e-in-your-project)
- [Стабильная версия](#stable-version)
- [Последняя версия](#latest-version)
- [Документация](#documentation)
- [Справочная документация](#reference-documentation)
- [Журнал изменений](#changelog)
- [Задания Tai-e](#tai-e-assignments)
## Что такое Tai-e?
Tai-e (кит.: 太阿; произношение: [ˈtaɪə:]) — это новый фреймворк статического анализа для Java (подробнее см. нашу [статью ISSTA 2023](https://cs.nju.edu.cn/tiantan/papers/issta2023.pdf)), который включает в себя, пожалуй, «лучшие» решения как из предложенных нами новых, так и из классических фреймворков, таких как Soot, WALA, Doop и SpotBugs.
Tai-e прост в изучении, удобен в использовании, эффективен и легко расширяем, что позволяет легко разрабатывать на его основе новые анализы.
В настоящее время Tai-e предоставляет следующие основные компоненты анализа (и другие анализы находятся в разработке):
- Мощный фреймворк анализа указателей
- Построение графа вызовов «на лету»
- Различные классические и продвинутые техники абстракции кучи и контекстной чувствительности для анализа указателей
- Расширяемая система плагинов анализа (позволяет удобно разрабатывать и добавлять новые анализы, взаимодействующие с анализом указателей)
- Настраиваемый анализ безопасности
- Анализ распространения меток (taint), позволяющий настраивать источники, стоки, переносы меток и санитайзеры
- Обнаружение различных утечек информации и уязвимостей инъекций
- Различные компромиссы между точностью и эффективностью (выигрыш от фреймворка анализа указателей)
- Различные фундаментальные/вспомогательные анализы
- Фундаментальные анализы, например, анализ рефлексии и анализ исключений
- Анализы современных языковых возможностей, например, анализ лямбда-выражений и ссылок на методы, а также анализ invokedynamic
- Вспомогательные инструменты, такие как таймер анализа, проверка ограничений (для отладки) и различные дамперы графов
- Фреймворк анализа потоков управления/данных
- Построение графа потоков управления
- Классические анализы потоков данных, например, анализ живых переменных, распространение констант
- Ваши собственные анализы потоков данных
- Система обнаружения ошибок, подобная SpotBugs
- Детекторы ошибок, например, детектор нулевых указателей, детектор некорректного `clone()`
- Ваши собственные детекторы ошибок
Tai-e разработан на Java и может работать во всех основных операционных системах, включая Windows, Linux и macOS.
Из уважения к разработчикам, мы просим вас **пожалуйста, [цитируйте](https://github.com/pascal-lab/tai-e/blob/master/CITATION.bib) статью** с ISSTA 2023, описывающую фреймворк Tai-e, в ваших исследовательских работах:
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](https://cs.nju.edu.cn/tiantan/papers/issta2023.pdf), [bibtex](https://github.com/pascal-lab/tai-e/blob/master/CITATION.bib)).
## Как получить работающий Tai-e?
Рекомендуемый способ — загрузить дистрибутивный ZIP-архив из [GitHub Releases](https://github.com/pascal-lab/Tai-e/releases).
ZIP-архив содержит Tai-e, все зависимости времени выполнения, офлайн-документацию и скрипты запуска для Windows, Linux и macOS.
В качестве альтернативы вы можете собрать последнюю версию Tai-e из исходного кода. Это легко сделать с помощью Gradle (убедитесь, что на вашей системе установлена Java 17 или выше):
```bash
./gradlew distZip
```
Дистрибутивный ZIP-архив будет создан в `tai-e/build/distributions/`.
После распаковки запустите Tai-e с помощью скрипта запуска:
```bash
# on Linux/macOS
./tai-e-<version>/bin/tai-e -h
# on Windows
.\tai-e-<version>\bin\tai-e.bat -h
```
Для совместимости со старыми релизами и скриптами Tai-e также предоставляет устаревший all-in-one JAR:
```bash
./gradlew fatJar
java -jar build/tai-e-all-<version>.jar -h
```
## Как включить Tai-e в свой проект?
Tai-e разработан как автономный инструмент, но у вас также есть возможность включить его в свой проект в качестве зависимости.
Он доступен в репозиториях Maven, что позволяет легко интегрировать его в ваши Java-проекты с помощью таких инструментов сборки, как Gradle и Maven.
Мы поддерживаем как стабильные, так и последние версии Tai-e, и ниже приведены соответствующие координаты в формате скриптов Gradle и Maven:
### Стабильная версия
Для Gradle:
```kotlin
dependencies {
implementation("net.pascal-lab:tai-e:0.5.4")
}
```
Для Maven:
```xml
<dependencies>
<dependency>
<groupId>net.pascal-lab</groupId>
<artifactId>tai-e</artifactId>
<version>0.5.4</version>
</dependency>
</dependencies>
```
### Последняя версия
Для Gradle:
```kotlin
repositories {
mavenCentral()
maven { url = uri("https://central.sonatype.com/repository/maven-snapshots/") }
}
dependencies {
implementation("net.pascal-lab:tai-e:0.5.5-SNAPSHOT")
}
```
Для Maven:
```xml
<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>
```
Вы можете использовать эти координаты в своих скриптах Gradle или Maven, чтобы включить нужную версию Tai-e в свой проект.
## Документация
### Справочная документация
Мы предоставили подробную информацию о Tai-e в [Справочной документации](https://tai-e.pascal-lab.net/docs/current/reference/en/index.html), которая охватывает различные аспекты, такие как [Настройка в IntelliJ IDEA](https://tai-e.pascal-lab.net/docs/current/reference/en/setup-in-intellij-idea.html), [Параметры командной строки](https://tai-e.pascal-lab.net/docs/current/reference/en/command-line-options.html) и [Разработка нового анализа](https://tai-e.pascal-lab.net/docs/current/reference/en/develop-new-analysis.html).
Обратите внимание, что указанная выше справочная документация относится к *последней версии* Tai-e.
Если вам нужна документация для конкретной стабильной версии, пожалуйста, обратитесь к [Индексу документации](https://tai-e.pascal-lab.net/docs).
Кроме того, документация включена в репозиторий и поддерживается вместе с исходным кодом.
Вы можете получить доступ к справочной документации для конкретной версии Tai-e (в формате AsciiDoc), изучив каталог [docs/en](https://github.com/pascal-lab/tai-e/blob/master/docs/en), начиная с [index.adoc](https://github.com/pascal-lab/tai-e/blob/master/docs/en/index.adoc).
Это позволяет вам получить доступ к документации для конкретной версии Tai-e.
В дополнение к справочной документации, [Javadocs](https://tai-e.pascal-lab.net/docs/current/api/index.html) для Tai-e также доступны как полезный справочный ресурс.
### Журнал изменений
Поскольку мы активно разрабатываем и обновляем Tai-e, мы записываем заметные изменения, особенно новые функции и критические изменения, в [CHANGELOG](https://github.com/pascal-lab/tai-e/blob/master/CHANGELOG.md).
Если вы обнаружите какие-либо проблемы после обновления Tai-e, возможно, вам стоит проверить [CHANGELOG](https://github.com/pascal-lab/tai-e/blob/master/CHANGELOG.md) на предмет полезной информации.
## Задания Tai-e
Кроме того, мы разработали [образовательную версию Tai-e](https://tai-e.pascal-lab.net/en/intro/overview.html), в которой тщательно разработаны восемь заданий по программированию для систематического обучения учащихся реализации различных методов статического анализа для анализа реальных Java-программ.
Образовательная версия использует большую часть кода Tai-e, поэтому выполнение заданий будет хорошим способом познакомиться с Tai-e.