-
Notifications
You must be signed in to change notification settings - Fork 273
Silent transformation of __CPROVER_{r,w,rw}_ok causing surprising behaviour #7377
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
Comments
There is some urgency to this one as it looks like the extra complication introduced into the assertion is part of a performance problem we are seeing (in a more complex example, of course). Removing this complication is important. |
the related issue is decribed here : #7378 |
I started to work on the issues noticed in here (as well as in #7378). #7395 should be part of the puzzle (once complete). I am still trying to figure out, however, what is really causing this performance problem (the issues listed in this ticket are to be addressed, but don't necessarily explain why performance should be so much worse). |
Can we get a status update? |
These expressions are now handled by the back-ends. Unconditional rewrites by goto_check_ct (even when no checks are enabled) are no longer necessary. Fixes: diffblue#7377
These expressions are now handled by the back-ends. Unconditional rewrites by goto_check_ct (even when no checks are enabled) are no longer necessary. Fixes: diffblue#7377
These expressions are now handled by the back-ends. Unconditional rewrites by goto_check_ct (even when no checks are enabled) are no longer necessary. Fixes: diffblue#7377
These expressions are now handled by the back-ends. Unconditional rewrites by goto_check_ct (even when no checks are enabled) are no longer necessary. Fixes: diffblue#7377
These expressions are now handled by the back-ends. Unconditional rewrites by goto_check_ct (even when no checks are enabled) are no longer necessary. Fixes: diffblue#7377
These expressions are now rewritten to their prophecy_* counterparts by goto-program conversion, and back-ends directly handle these prophecy_* expressions. Unconditional rewrites by goto_check_ct (even when no checks are enabled) are no longer necessary. Fixes: diffblue#7377
These expressions are now rewritten to their prophecy_* counterparts by goto-program conversion, and back-ends directly handle these prophecy_* expressions. Unconditional rewrites by goto_check_ct (even when no checks are enabled) are no longer necessary. Fixes: diffblue#7377
These expressions are now rewritten to their prophecy_* counterparts by goto-program conversion, and back-ends directly handle these prophecy_* expressions. Unconditional rewrites by goto_check_ct (even when no checks are enabled) are no longer necessary. Fixes: diffblue#7377
These expressions are now rewritten to their prophecy_* counterparts by goto-program conversion, and back-ends directly handle these prophecy_* expressions. Unconditional rewrites by goto_check_ct (even when no checks are enabled) are no longer necessary. Fixes: diffblue#7377
These expressions are now rewritten to their prophecy_* counterparts by goto-program conversion, and back-ends directly handle these prophecy_* expressions. Unconditional rewrites by goto_check_ct (even when no checks are enabled) are no longer necessary. Fixes: diffblue#7377
These expressions are now rewritten to their prophecy_* counterparts by goto-program conversion, and back-ends directly handle these prophecy_* expressions. Unconditional rewrites by goto_check_ct (even when no checks are enabled) are no longer necessary. Fixes: diffblue#7377
These expressions are now rewritten to their prophecy_* counterparts by goto-program conversion, and back-ends directly handle these prophecy_* expressions. Unconditional rewrites by goto_check_ct (even when no checks are enabled) are no longer necessary. Fixes: diffblue#7377
These expressions are now rewritten to their prophecy_* counterparts by goto-program conversion, and back-ends directly handle these prophecy_* expressions. Unconditional rewrites by goto_check_ct (even when no checks are enabled) are no longer necessary. Fixes: diffblue#7377
These expressions are now rewritten to their prophecy_* counterparts by goto-program conversion, and back-ends directly handle these prophecy_* expressions. Unconditional rewrites by goto_check_ct (even when no checks are enabled) are no longer necessary. Fixes: diffblue#7377
These expressions are now rewritten to their prophecy_* counterparts by goto-program conversion, and back-ends directly handle these prophecy_* expressions. Unconditional rewrites by goto_check_ct (even when no checks are enabled) are no longer necessary. Fixes: diffblue#7377
These expressions are now rewritten to their prophecy_* counterparts by goto-program conversion, and back-ends directly handle these prophecy_* expressions. Unconditional rewrites by goto_check_ct (even when no checks are enabled) are no longer necessary. Fixes: diffblue#7377
These expressions are now rewritten to their prophecy_* counterparts by goto-program conversion, and back-ends directly handle these prophecy_* expressions. Unconditional rewrites by goto_check_ct (even when no checks are enabled) are no longer necessary. Fixes: diffblue#7377
These expressions are now rewritten to their prophecy_* counterparts by goto-program conversion, and back-ends directly handle these prophecy_* expressions. Unconditional rewrites by goto_check_ct (even when no checks are enabled) are no longer necessary. Fixes: diffblue#7377
Posting an analysis by @nwetzler, @jimgrundy and @remi-delmas-3000 The attached a gzipped tarball contains a single C file and a script to demonstrate the problem.
The following function takes a single pointer and asserts that it is read/write okay:
We can compile this to goto (to create a.out) and then run goto-instrument on the resulting binary to create a new binary (which is b.out). Off the bat, you’ll notice that the size of these two binaries is different. However, if you show-goto-functions or program-only (for the SSA) and compare the two, they will be identical.
But if you now enable pointer-check and pointer-primitive-check, you’ll see that they produce different show-goto-functions and program-only output. Furthermore, we think the assertions produced by the checks are even semantically different between the two, which seems like a bug in CBMC.
Several issues appear to arise:
goto-instrument
will always call into instrumentation steps.goto-instrument a.out b.out
will perform transformations despite no such transformation being requested.__CPROVER_{r,w,rw}_ok
thatgoto_check_ct
does (irrespective of whether a property instrumentation was requested).goto_check_ct
is not idempotent: doing one round ofgoto_check_ct
followed by another with--pointer-primitive-check
enabled is not the same as doing just one round ofgoto_check_ct
with--pointer-primitive-check
enabled.The text was updated successfully, but these errors were encountered: