Unwinding means to “un-wind” the iterations of a loop.
Take the following loop:
How do you turn this into a proof? You can’t! Instead you bound the model to a fixed set of iterations to do a bounded proof, so an unwinding of 4 would collapse into:
This raises one big concern: how can I take this proof as a meaningful verdict if my code does more iterations?
In bmc4j our answer is to return Unknown - if execution could run past the bound, we won’t claim Verified on a loop we couldn’t fully explore.
By default you don’t pick the bound at all: bmc4j finds one for you, trying increasing bounds until the loops are fully covered, then verifying. A loop it can’t cover within the cap (like the while (true) above) comes back Unknown — never a false Verified. It reports the bound it settled on, so you can pin @BmcProof(unwind = N) to lock it in — handy to skip the search, or to push a deep loop past the default cap.