Repository navigation
Move the property pre-check to cfg-extraction; prune under no-runtime-exception (#93) - #108
Open
solid-eureka wants to merge 13 commits into
Open
solid-eureka wants to merge 13 commits into
solid-eureka wants to merge 13 commits into
Conversation
Char codes are bounded by 0xFFFF (Java chars), and chars widened to int are lifted too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
indexOf of a char searches the char itself, code points are split over bit-vectors, and literals with surrogates are built char by char. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The harness requirements still pinned z3-solver 4.14.1, so the explorer ran on it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bit-vector inputs under ubv_to_int (string indices, from arguments) get Integer stand-ins, and the model is mapped back to the inputs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
DFS stays the default. coverage tries branch sides no trace took yet first. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Off by default. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The check moved to cfg-extraction; the explorer runs its cfg-extractor-precheck.jar (--precheck-jar) and the executor no longer contains it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CI builds it from cfg-extraction at the tag in cfg-extraction.ref. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A phantom guard marked cannotRaise by the extractor leads to a dead node on its exception side. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The graph's target points are chosen by property: runtimeExceptionPointIds under no-runtime-exception. Opt-in in the harness (--sa-no-runtime-exception). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
How many branches refEquals takes depends on runtime types, so the graph has none of them; the walk holds its place instead of falling out of step. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
cfg-extraction is public now, and v0.1.0 (the tag cfg-extraction.ref names) exists. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 27, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Implements the plan from #93: the static property pre-check moves into cfg-extraction, the check and the static pre-analysis graph share instruction facts, and the graph can prune under no-runtime-exception. It also fixes two walk desyncs that came up on the way.
It needs the matching cfg-extraction branch
issue-93-precheck-in-cfg-extraction.Changes
Step 1: the pre-check lives in cfg-extraction
cfg-extractor-precheck.jar(--precheck-jar, or found next tosymbolic-explorer/, or in../cfg-extraction/build/libs/). The executor no longer contains the check.cfg-extraction.ref.Step 2: shared facts between the check and the graph
cannotRaise), from the check's value analysis.SAGraphturns the exception side of such guards into a dead end.Step 3: pruning under no-runtime-exception
runtimeExceptionPointIds(the sites that may raise a RuntimeException, plusuncaught[T]of RuntimeException types) under no-runtime-exception.svcomp test run --sa-no-runtime-exception.Walk desyncs
UtilInstrumented.refEquals) are flagged like callbacks, since their number depends on runtime types. cfg-extraction drops its outdated two-branch model of the helper.Verifier.nondetObjectinto the factory it calls, as the executor runs it.Results
SA on, 300 s per task, before and after the changes in this branch:
sa-soundness(120): correct verdictsscripts/precheck_gate.py) finds 426 + 3 proofs with 0 contradictions.Before merging
CFG_EXTRACTION_TOKENwith read access to the private cfg-extraction repository, or the repository has to become public. Until then CI fails at "Check out cfg-extraction" and skips the test and package jobs.cfg-extraction.refnamesv0.1.0, which does not exist yet.Note
This branch is based on
niklas/dev, so the PR also contains its six commits that are not indevyet (string encodings andInt2BvLifting, Z3 5.3.1 in the harness,--search-order,--prefer-short-strings).e9dec3d(char codes lifted without modulo) may overlap with #99.🤖 Generated with Claude Code