Papers for

java developers

Papers whose findings have a practical use for this group, as judged from the abstract. Open a paper to read what it means in practice.

Dynamic invariant detection improves software bug finding with lower cost

Template-Free Dynamic Invariant Detection

Abstract: A dynamic invariant detector proposes invariants, such as method pre- and postconditions, and rules out those that do not hold at run time. Traditional detectors propose invariants from a fixed library of templates, which limits their expressiveness. A large language model (LLM) can propose invariants instead of, or in addition to, template-derived ones. With the right prompt and context choices, we found that this idea can both improve the invariants' expressiveness and reduce the cost of inferring the invariants. Greater expressiveness brings complications: an LLM-proposed invariant can execute arbitrary code during invariant evaluation, causing side effects or infinite loops. Our novel instrumentation strategies mitigate these problems. We wrap each candidate and evaluate only one invariant per thread at a time, so nested invariant evaluations cannot trigger one another indefinitely. To recover from non-nested hangs, we monitor each run for stalls and retry it under a growing time budget. Because we cannot prove a candidate side-effect-free in advance, we use delta debugging over the invariants evaluated during a failing test to isolate and disable a side-effecting candidate without discarding the rest of the run. We compared our implementation, Oca, to the popular template-based Daikon invariant detector on real open-source Java projects. Oca produces more expressive invariants: on average, 28% of its held invariants call a project-specific method, which Daikon's templates cannot express. Its invariants are more often valid, with a false-positive rate of 18% in a manual inspection, vs. 76% for Daikon, and more useful: as properties for property-based testing, they exposed 9 of 25 real bugs, compared with 4 for Daikon. Oca also costs less, using 566 minutes and 27 GB of disk, compared with 2,817 minutes and 827 GB for Daikon.

Wed 28 OctSoftware Engineering
The gist
Software often needs rules called invariants to work correctly, but traditional methods find only simple rules. The authors developed a new system that uses a large language model to find more expressive and useful rules without relying on fixed templates. Because these new rules can cause problems like crashes or slowdowns, the system uses special techniques to safely test them. This new approach finds better rules faster and helps catch more bugs than previous tools.
Open → 2610.38130v1

LLM generated unit tests miss critical edge cases and exceptions

Beyond Coverage and Mutation: A Blind-Spot Analysis of LLM-Generated Unit Tests

Abstract: Existing evaluation protocols for unit tests rely on aggregate metrics such as branch coverage and mutation score. These metrics quantify the extent to which a test suite exercises program behavior, but do not identify the behavioral obligations it systematically leaves unchecked. We propose BlindSpotEval, an obligation-based evaluation framework aligned with the Arrange-Act-Assert pattern. The framework comprises three metrics, Boundary-Value Adequacy, Control-Flow Adequacy, and Oracle Strength, complemented by an assessment of execution reliability. We also introduce ObligBench, a complexity-stratified Java benchmark comprising 895 complex and 700 low-complexity functions with source-side obligation annotations. Evaluating 14,320 tests from four LLMs under four prompting strategies reveals systematic blind spots. Incorrect assertions account for 15.6% of test failures, illustrating that coverage alone does not establish oracle correctness. Among executable tests, coverage of null, negative, and empty arguments reaches only 34.8%, 23.8%, and 38.8%, compared with average coverage above 93% for booleans. Catch blocks and default groups have Control-Flow Adequacy scores of only 0.100 and 0.312. Across both dimensions, LLM-generated tests exhibit the happy-path bias observed in human-written tests, concentrating on normal inputs and expected flows while leaving unusual values and exceptional paths unchecked. Oracle strength is high on average but uneven, with weaker assertions for object return property values and exceptions. These blind spots also occur in low-complexity functions, suggesting that code complexity alone does not explain them. BlindSpotEval provides construct-level adequacy profiles that identify under-tested obligation types and can guide targeted improvements beyond those supported by aggregate scores alone.

Fri 23 OctSoftware Engineering
The gist
Current ways to measure how good automatically created unit tests are mostly look at how much of the code the tests run, but they miss important things the tests should check. The authors developed a new way to evaluate tests that focuses on specific things the tests should catch, like edge cases and exceptions. They tested many AI-based test generators on Java programs and found the tests often skip unusual inputs and error handling. This shows that just covering code is not enough to trust the tests completely.
Open → 2610.32548v1

RXSynth provides large Java runtime bug method pairs dataset

RXSynth: A Seed-Grounded Corpus for Studying Java Runtime-Exception Bugs

Abstract: Existing Java bug benchmarks offer limited method-level data for studying runtime-exception detection. Filtering Defects4J, Bugs.jar, Bears, and BugSwarm yields only 170 real buggy/fixed method pairs across seven unchecked exception types. We introduce RXSynth, a corpus of 4,275 synthetic Java method pairs generated from real bug/fix exemplars. We select the generator using structural alignment with real seeds and validate pairs using a two-stage patch-anchored procedure that identifies the labelled exception risk and checks whether the repair removes it. Independent JVM execution confirms patch-local validity for 84.2% of a stratified sample of 500 pairs. Provenance records enable evaluation without overlap between generation exemplars and test bugs. Structural analyses show good alignment within the represented size range, but compression of larger methods. We use RXSynth to compare isolated-method detection with pair discrimination when the repair is visible. Under provenance-controlled evaluation, supervised isolated-method ROC-AUC is about 0.55-0.64. Stronger zero-shot models reach about 69% accuracy but identify only 41.2% of repaired methods correctly. In contrast, fine-tuned encoders achieve 70.4-74.8% accuracy with both versions available. However, a simple token-growth rule achieves 84.7% expected accuracy, highlighting repair-direction cues. On 36 pairs without token growth, encoder accuracy falls to approximately chance, while GPT-5.5 and Gemini 3.1 Pro exceed 94%. RXSynth thus supports contrastive, patch-oriented, and context-aware studies; pairwise evaluations should control for provenance and directional surface cues before interpreting high accuracy as defect understanding.

Sat 17 OctSoftware Engineering
The gist
Finding real buggy Java methods with runtime exceptions is hard because existing datasets are very small. The authors created RXSynth, a much bigger collection of Java method pairs made by mimicking real bug fixes in a controlled way. Their tests show the synthetic bug fixes act like real ones, making it useful to study how well different tools can detect and understand these bugs. They also found simple comparisons often reveal just superficial patterns rather than true bug understanding, suggesting more careful evaluation is needed.
Open → 2610.24902v1

Pattern analysis uncovers hidden method requirements in Java code

Pattern-Based Precondition Inference from Method Implementations

Abstract: Method preconditions define the conditions that must be satisfied before a method is called. Often, such conditions are not documented and must be inferred. We present Prex, a pattern-based static analysis approach that infers preconditions from explicit checks in Java source code. For each precondition, Prex reports the condition required for a valid call and the reported exception in the case of a violation. Prex also attempts code transformations to convert the condition detected within a method's implementation into an expression that can be evaluated by client code. It leverages the concept of a mutation boundary to separate precondition checks from exceptions that may occur after the method changes the program state. We evaluated Prex from 46 open source Java projects and manually reviewed independent samples of 150 reports. Among the 150 Prex reports, 149 were correct and 125 of the correct reports were executable by client code. In a systematic comparison with an alternative approach based on path expansion, Prex provided more precise results. In total, 122 of the 149 correct reports had no relevant method documentation, and 41 required nontrivial source code analysis to recover manually. Overall, explicit source-code checks provide precondition information that can be absent from method documentation, and Prex can help recover it.

Fri 16 OctSoftware Engineering
The gist
Many methods in programs need certain conditions to be true before they run correctly, but these conditions are often not clearly explained. The authors created Prex, a tool that looks inside Java code to find these hidden rules by spotting checks that stop bad inputs. Prex also tries to rewrite these rules so other code can check them before calling the method. Their tests showed Prex was accurate and found many rules that programmers hadn’t written down.
Open → 2610.24204v1

Improved constant value checks in Java with SMT solver integration

More Powerful Constant Value Checking with SMT Solving

Abstract: Pluggable type systems extend the basic type system of a programming language by introducing additional type hierarchies to specify more complex properties and dependencies between variables. We consider the Constant Value Checker, a pluggable type checker for Java implemented using the Checker Framework, which provides various pluggable type systems and corresponding checkers. The Constant Value Checker lets users specify restrictions on the values a primitive integer or boolean variable can hold using a set or range of constant values. However, the current implementation of the Value Checker makes use of a limited set of syntactic typing rules that, in practice, often fail to verify well-typedness of more complex code. In this paper, we introduce an extension to the Checker Framework using Satisfiability Modulo Theories (SMT) solvers to address these limitations by creating corresponding first-order logic formulas for expressions whose type checks fail with the current syntactic typing rules and determining their well-typedness based on the satisfiability of these formulas. Furthermore, we introduce new dependent types for specifying allowed values with expressions that can depend on other variables in the program.

Sun 4 OctProgramming Languages
The gist
Programming languages often check if variables hold only allowed values to avoid bugs. The authors show that existing Java tools for checking constant values can miss some issues when the code is complex. They enhance this checking by using SMT solvers, which are mathematical tools that decide if logical conditions can be true. This allows the checker to verify more complicated cases and use new types that depend on other variables’ values.
Open → 2610.05316v1

Retrofitting code with large language models to add exception handling

Retrofitting Code Using LLMs to Support Exceptional Behavior

Abstract: Exception Related Code (ERC), which includes throw statements, conditions (if statements) that guard those throw statements, and try/catch blocks, is an essential component of software systems, allowing developers to detect and handle exceptional states that deviate from the expected program behavior. However, manually writing ERC across large codebases is tedious. We propose a novel task: retrofitting existing code with ERC. Namely, given code (without ERC) and Exceptional Behavior Tests (EBTs) (e.g., check if method throws InvalidArgumentException if null is given as the value to the argument) we aim to automatically generate missing ERC, such that the given tests pass. We design and implement Exception Coder (EXCODER) that performs context engineering to help Large Language Models (LLMs) tackle this task. EXCODER integrates static and dynamic program analysis with LLMs by providing the extracted contextual information to the LLMs. To evaluate EXCODER, we build a benchmark constructed from GitHub Java repositories, where we systematically remove ERC in 304 methods from 75 projects. Our results demonstrate that EXCODER provides an effective, though imperfect, solution to this problem in automated code generation, offering developers the first way to implement ERC following test-driven development. When combined with Qwen 2.5 Coder 32b, EXCODER achieves pass@1, 5, and 10 rates of 85.92% (12.56 percentage points over baseline), 86.18% (12.82 p.p. over baseline), and 86.51% (13.15 p.p. over baseline), respectively, on developer-written test suites. Our manual inspection of the generated code further reveals limitations of EXCODER, pointing to directions for future work.

Wed 9 SeptSoftware EngineeringComputation and Language
The gist
Software often needs special code to handle unusual or error situations, but writing this code can be boring and time-consuming. The authors created a method called EXCODER that helps large language models add this special exception-handling code automatically to existing programs when given tests that expect errors. EXCODER works by combining static analysis (looking at the code structure) and dynamic analysis (running code) with language models to better understand where and how to add these corrections. Their tests show EXCODER does a good job, though not perfect, of generating this code to pass developer-written tests.
Open → 2609.10397v1