Skip to content

Plugin configuration

Project-wide defaults live in the bmc { } block in your build.gradle.kts. Almost every one can be overridden for a single run with a -Dbmc.* system property, and a value on a @BmcProof always wins over the project default.

bmc {
// unwind defaults to AUTO: each proof discovers its own loop bound
timeoutSeconds = 60
stringMode = "refinement"
}
bmc { }-Dbmc.*DefaultWhat it does
unwindunwindAUTODefault loop bound. AUTO discovers it; a positive value pins one bound for every proof.
unwindCap(unwindCap)16Highest bound AUTO climbs to before giving up with Unknown.
parallelismparallelismCPU countHow many proofs run at once, each its own process.
timeoutSecondstimeoutSecondsnoneDefault wall-clock budget per proof.
solversolverMiniSatDefault SAT/SMT backend. See External solver.
stringModestringModerefinementDefault String model. See String modes.
maxStringLengthmaxStringLength16Bound on symbolic string length.
removeExceptionMessagesremoveExceptionMessagesautoWhether to drop unread exception messages.
cachenoCacheonSkip re-verifying a proof whose inputs haven’t changed.
progressonPrint per-proof progress during gradlew test.

These control what counts as a gap versus an accepted shortcut:

bmc { }-Dbmc.*What it does
allowStubsallowStubsMethods every proof may run as havoc’d stubs without a warning.
acknowledgeUnmodelledacknowledgeUnmodelledJDK members bmc4j can’t model that proofs may reach as havoc instead of Unknown.
strictStubsstrictStubsTurn an unacknowledged stub into Unknown instead of a footnote.
strictModelsstrictModelsTurn an unregistered user model into Unknown.
notModeledPackagesnotModeledPackagesWhole packages declared out of scope for modeling.
jbmcPathjbmcUse a local engine binary instead of the bundled one.

The plugin id is org.bmc4j. Apply it and proofs are just JUnit 5 tests under gradlew test.