Jlisa
Java static analyzer built on LiSA โ abstract interpretation, interprocedural analysis, and formal program verification. SV-COMP 2026 ๐ฅ
Install / Use
/learn @lisa-analyzer/JlisaREADME
JLiSA โ Java Frontend of LiSA (Library for Static Analysis)
JLiSA is a static analysis tool for Java programs, built on top of the LiSA (Library for Static Analysis) framework. It provides a front-end that translates Java source files into LiSA's control flow graph (CFG) representation, enriches it with the semantics of a subset of the Java standard library, and runs configurable abstract interpretation analyses to detect bugs and verify program properties.
JLiSA is a joint effort between the Software and Systems Verification (SSV) Research Group at Ca' Foscari University of Venice and the University of Parma.
๐ฅ SV-COMP 2026 โ Bronze Medal
In its first participation at SV-COMP 2026 (15th International Competition on Software Verification), JLiSA achieved 3rd place in the Java track, earning the bronze medal. SV-COMP is the world's leading competition in automated software verification; results are presented at TACAS 2026, held in Turin, Italy, in April 2026.
Arceri et al., "JLiSA: The Java Frontend of the Library for Static Analysis" (Competition Contribution), SV-COMP 2026. Artifact: doi.org/10.5281/zenodo.17609338
Further details in the press releases from Ca' Foscari University and University of Parma.
The Team
| Name | Institution | |---|---| | Vincenzo Arceri | University of Parma | | Luca Negrini | Ca' Foscari University of Venice | | Giacomo Zanatta | Ca' Foscari University of Venice | | Filippo Bianchi | University of Parma | | Teodors Lisovenko | Ca' Foscari University of Venice | | Luca Olivieri | Ca' Foscari University of Venice | | Pietro Ferrara | Ca' Foscari University of Venice |
Table of Contents
Overview
JLiSA translates Java source code into LiSA's intermediate representation and runs abstract interpretation analyses over the resulting program model. The analysis configuration is fully customizable โ abstract domains, interprocedural strategy, and semantic checkers can all be selected independently. For SV-COMP 2026, JLiSA was configured with the following components:
- Field-sensitive, point-based heap abstraction โ tracks heap objects at allocation sites with per-field sensitivity
- Reduced product of constant propagation and interval domain โ abstracts numerical, string, and Boolean values
- Type inference โ tracks runtime types of expressions
- Reachability analysis โ distinguishes definitely reachable instructions from possibly reachable or unreachable ones, improving precision on conditional branches
- Call-string-based interprocedural analysis โ context-sensitive up to 150 nested calls, with 0-CFA for call graph construction
- Semantic checkers โ verifies
assertstatements and detects potential uncaught runtime exceptions
Installation
Prerequisites: Java 17+, Gradle (wrapper included), GitHub credentials for the LiSA dependency.
LiSA Dependency
LiSA packages are hosted on GitHub Packages. Add your credentials to ~/.gradle/gradle.properties:
gpr.user=<your-github-username>
gpr.key=<your-github-personal-access-token>
Or export the environment variables USERNAME and TOKEN.
Build
git clone https://github.com/lisa-analyzer/jlisa.git
cd jlisa/jlisa
./gradlew build
This runs code style checks and compiles the project. To produce a self-contained executable ZIP:
./gradlew distZip
The archive is written to build/distributions/jlisa-0.1.zip.
Usage
After building the distribution, run JLiSA directly:
./build/distributions/jlisa-0.1/bin/jlisa -s path/to/File.java -o out/
Or via Gradle without packaging:
./gradlew run --args="-s path/to/File.java -o out/ -n ConstantPropagation"
Results are written to the output directory as JSON files (one per CFG) and a report.json summary.
Command-Line Options
| Option | Long Option | Argument | Description |
|--------|-------------|----------|-------------|
| -s | --source | file... | Java source files to analyze (space-separated) |
| -o | --outdir | path | Output directory for analysis results |
| -n | --numericalDomain | domain | Numerical domain: ConstantPropagation |
| -c | --checker | checker | Semantic checker: Assert |
| -l | --log-level | level | Log verbosity: INFO, DEBUG, WARN, ERROR, OFF |
| -m | --mode | mode | Execution mode: Debug (default), Statistics |
| -v | --version | โ | Print the tool version |
| -h | --help | โ | Print the help message |
| N/A | --no-html | โ | Disable HTML output (enabled by default) |
Architecture
Java source code is parsed via the Eclipse Java Development Tools (JDT) library.
JLiSA's frontend translates Java source files to LiSA's IR in five sequential passes, implemented using the JDT visitor pattern in the following classes:
PopulateUnitsASTVisitorโ registers all class and interface stubs in the programSetRelationshipsASTVisitorโ resolves superclass and interface relationshipsSetGlobalsASTVisitorโ registers fields and enum constantsInitCodeMembersASTVisitorโ declares method and constructor signaturesCompilationUnitASTVisitorโ performs full body translation, generating CFGs
Java Standard Library
Standard library classes are not parsed from source. Instead, hand-written stub files (src/main/resources/libraries/*.txt) declare class hierarchies, fields, and method signatures using a custom DSL parsed by an ANTLR grammar. Method semantics are implemented as Java classes under it.unive.jlisa.program.java.constructs. Stubs are loaded lazily at analysis time by LibrarySpecificationProvider.
Key Packages
| Package | Purpose |
|---|---|
| it.unive.jlisa.frontend | Parsing pipeline, JavaFrontend, ParserContext |
| it.unive.jlisa.frontend.util | Shared utilities (e.g. FQNUtils for building fully qualified names) |
| it.unive.jlisa.frontend.visitors | AST visitor base classes and hierarchy |
| it.unive.jlisa.program.cfg.expression | Java-specific expression nodes |
| it.unive.jlisa.program.cfg.statement | Java-specific statement nodes |
| it.unive.jlisa.program.java.constructs | Library method semantics |
| it.unive.jlisa.program.libraries | Library stub loader |
| it.unive.jlisa.program.type | Java type system |
| it.unive.jlisa.analysis | Abstract domains (heap, value, type) |
| it.unive.jlisa.interprocedural | Call graph and interprocedural analysis |
| it.unive.jlisa.checkers | Semantic checkers (AssertChecker) |
| it.unive.jlisa.witness | Violation witness generation (GraphML) |
Development
Running Tests
# Run all tests
./gradlew test
# Run a single test class
./gradlew test --tests "it.unive.jlisa.cron.MathTest"
# Run a single test method
./gradlew test --tests "it.unive.jlisa.cron.MathTest.testMath"
Test inputs live in java-testcases/ and expected JSON outputs are stored alongside them. To regenerate expected outputs after an intentional change, temporarily set conf.forceUpdate = true in TestHelpers.
Code Style
JLiSA uses Spotless (Eclipse formatter) and Checkstyle. Formatting uses tabs, not spaces.
# Check style
./gradlew checkCodeStyle
# Auto-fix formatting
./gradlew spotlessApply
License
This project is licensed under the MIT License.
Related Skills
node-connect
346.4kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
107.2kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
346.4kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
346.4kQQBot ๅฏๅชไฝๆถๅ่ฝๅใไฝฟ็จ <qqmedia> ๆ ็ญพ๏ผ็ณป็ปๆ นๆฎๆไปถๆฉๅฑๅ่ชๅจ่ฏๅซ็ฑปๅ๏ผๅพ็/่ฏญ้ณ/่ง้ข/ๆไปถ๏ผใ
