← Latest papers
💻 computer science

A-Str: Acyclic String Constraint Solver withNative Java String API Support

This paper presents A-Str, an acyclic automata-based string constraint solver that natively supports Java String APIs to efficiently and robustly solve complex Java verification and dynamic symbolic execution benchmarks, outperforming existing tools on Java-specific tasks while remaining competitive on standard SMT-LIB benchmarks.

Original authors: Nathanael Steven, Elena Sherman

Published 2026-10-12
📖 5 min read🧠 Deep dive

Original authors: Nathanael Steven, Elena Sherman

Original paper licensed under CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/). ✨ This is an AI-generated explanation of the paper below. It is not written or endorsed by the authors. For technical accuracy, refer to the original paper. Read full disclaimer

In the digital world, software verification is the rigorous process of proving that a computer program will behave exactly as intended, without crashing or leaking secrets. To do this, engineers often use a technique called symbolic execution, which treats a program's inputs not as fixed numbers or words, but as open-ended variables that can represent any possible value. As the program runs, the system tracks the rules and conditions these variables must satisfy to reach a specific point, such as a security check or a critical calculation. The challenge arises when these variables are strings—sequences of letters and numbers. Unlike simple math, strings have complex rules for how they can be joined, split, or compared. To determine if a program can ever reach a dangerous state, a computer must solve a puzzle: can we find specific words that make all these rules true at once? This is the job of a string constraint solver, a specialized tool that acts as a logic engine for text. While general-purpose solvers exist, they often struggle with the unique, intricate commands found in modern programming languages like Java, where text manipulation is a daily occurrence.

Researchers at Boise State University, Nathanael Steven and Elena Sherman, have developed a new tool called A-Str to address this specific gap. Their work focuses on the fact that standard logic tools used in the field are often too rigid to handle the full range of text operations that Java programs perform. In Java, a programmer can easily reverse a word, remove spaces, or check if one sentence starts with another. However, the standard mathematical language used to describe these problems to computers does not have direct instructions for these actions. When existing tools try to model these Java commands, they often have to use complex, recursive definitions that slow them down or cause them to give up entirely. The authors realized that instead of forcing these complex Java commands into a standard mold, they could build a solver that speaks the language of Java natively, using a method based on finite automata. In this context, an automaton is best understood as a map of all possible paths a string can take; because the researchers restricted their maps to be acyclic, meaning they contain no loops, the system could guarantee that it would always finish its calculation within a reasonable time.

The core of the A-Str system is a backward-propagation framework that works differently from previous attempts. Imagine a detective tracing a crime scene back to the suspect. Most solvers try to guess the suspect's identity first and then check if the clues fit. A-Str, however, starts with the final clue—the condition that must be true at the end of the program—and works backward through every step of the code to see what the starting words must have been to produce that result. The system builds a flow chart of the program's logic and moves a set of possible strings backward through it. At each step, it applies the inverse of the operation that occurred. If the program added a letter, the solver removes it; if the program checked if a word started with a specific letter, the solver filters out all words that do not start with that letter. A key innovation in this paper is how the system handles situations where a single operation could have come from many different starting points. Instead of getting stuck, the solver intelligently splits the problem into smaller, manageable pieces, checking each possibility until it finds a consistent path or proves that no such path exists.

The researchers tested A-Str against the current state-of-the-art tools used in the industry, including Z3-Noodler, cvc5, and Ostrich. They evaluated the new solver in three distinct scenarios. First, they tested it on constraints derived directly from real-world Java verification tasks. In this environment, A-Str proved remarkably robust, successfully handling every single benchmark it was given. It avoided the timeouts and "unknown" responses that frequently plague other tools when faced with complex, real-world Java code. Second, they tested it on a set of benchmarks generated from dynamic symbolic execution of actual Java programs. These tests involved more complex and varied string operations. Here, A-Str performed on par with the fastest existing solver, Z3-Noodler, efficiently completing the most difficult queries that other tools struggled to finish. Finally, the team tested the solver on standard, generic benchmarks used to compare all string solvers in the field. In this specific category, A-Str was capable but less competitive than the established leaders, which are optimized for these generic, abstract problems rather than the specific nuances of Java.

The findings suggest that while general-purpose solvers remain the kings of abstract theory, a specialized approach is far superior for practical software verification. By accepting a limitation—that it only solves problems within a predefined length bound—the researchers gained a significant advantage in speed and reliability for the specific domain of Java programs. The paper explicitly argues against the idea that a single, universal solver can efficiently handle both generic mathematical benchmarks and the rich, complex operations of real-world programming languages. The authors demonstrate that trying to model Java's rich text commands using standard, generic logic often leads to inefficiency and failure. Instead, they show that a solver designed to manipulate the underlying structures of text directly, without relying on complex recursive definitions, can navigate the constraints of real programs with greater ease. The study confirms that for the specific task of verifying Java software, a tool built to understand the language's native operations is not just a helpful alternative, but a necessary evolution to handle the complexity of modern code without getting stuck.

Drowning in papers in your field?

Get daily digests of the most novel papers matching your research keywords — with technical summaries, in your language.

Try Digest →