-
Notifications
You must be signed in to change notification settings - Fork 41
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conceptual problem in DiffWrapperScript #577
Comments
Perhaps @jhoenicke has an idea for that. |
The problem is that it wasn't designed for quantifiers. There are several solutions:
Option 4. is tricky as you have to determine whether the quantifier occurs positive or negative and doesn't work, if it occurs in the condition of an ite. I'm leaning towards solution 3, as it seems a simple enough change (just add universal quantifiers). |
I don't understand solution 3. Do you suggest that we add two kinds of axioms? |
The solution 3. would be to build the axiom, then check if it has free variables (Term.getFreeVariables()), and if that returns a non-empty array, add a forall quantifier around it. |
I don't understand your fix. Let's assume I call |
In
|
If the DiffWrapperScript see a term in which there is a quantified variable inside the
@diff
function (e.g.,(and (< |c_#StackHeapBarrier| |c_ULTIMATE.start_main_~#s~0#1.base|) (exists ((|v_#length_BEFORE_CALL_4| (Array Int Int))) (let ((.cse0 (@diff |v_#length_BEFORE_CALL_4| |c_#length|))) (and (<= 4 (select |v_#length_BEFORE_CALL_4| |c_ULTIMATE.start_main_~#s~0#1.base|)) (or (= |c_#length| |v_#length_BEFORE_CALL_4|) (<= (+ .cse0 1) |c_#StackHeapBarrier|)) (= |c_#length| (store |v_#length_BEFORE_CALL_4| .cse0 (select |c_#length| .cse0)))))) (= |c_ULTIMATE.start_main_~#s~0#1.offset| 0))
it asserts an axiom (e.g.,(=> (let ((.cse0 (ULTIMATE@diffIntInt |v_#length_BEFORE_CALL_4| |c_#length|))) (= (select |v_#length_BEFORE_CALL_4| .cse0) (select |c_#length| .cse0))) (= |v_#length_BEFORE_CALL_4| |c_#length|))
that contains all subterms of the@diff
function. Hence the axiom is not a closed formula and the SMT solver cannot assert the axiom. (The axiom does not make sense at all.)A typical error message is
Interpolation failed due to KNOWN_DEPENDING: line 54101 column 46: unknown constant v_#length_BEFORE_CALL_2
.In a 90s SV-COMP run that compared two settings the problem occurred 55 times.
One example is
./Ultimate.py --spec ../sv-benchmarks/c/properties/valid-memsafety.prp --file ../sv-benchmarks/c/list-simple/sll2c_remove_all.i --full-output --architecture 32bit
.The text was updated successfully, but these errors were encountered: