-
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
Bug / Question: Inconsistent verification results depending on blockencoding settings #596
Comments
Quick answer: yes, it should be equivalence preserving. |
Again, I can't say for sure that the bug is not related to our extensions. So please don't spend too much time on it! |
I could reproduce this problem. Maybe the verification of such examples is speed up by utilizing our procedure inlining plugin. I am however not sure whether this inlining plugin will pass the LTL step attributes. |
Obtaining counterexample that contain variable values (also in the presence of procedure calls) is actually more important to us than the potential bug in the block encoding. I just came across it and thought that I'd better report it so that it is not forgotten. Could you clarify if variable values are generally not reported in counterexamples for programs with nested procedures? |
@martin-neuhaeusser this reminds me: you wanted to open an issue / send us an example where we do not produce values in counterexamples. |
@danieldietsch I just opened another issue #597 for the counter-example values. An example is attached there. |
After 2b22b30 the counterexample looks as follows. |
No. But the inlining might improve the performance of the verification. (Might improve, maybe it slows the performance down, it depends on the verification task.) |
It seems to me like the value of this variable is lost in the backtranslation of some of the toolchain's plugins. |
As far as I can see, the reason for the incorrect violation is in line 433 of the counterexample:
The corresponding branch is (erroneously) taken, which leads to an exception being raised (in the Boogie model) in line L434-L435):
That directly leads to a violation of the LTL property, which asserts (among other details) that no exception is raised (i.e. that So (with my limited understanding of the internals of Ultimate) I tend to believe that something goes wrong before the counter-example is mapped back. The very reason that a (this!) counter-example is found relates to the value of the |
Ok, I spotted another problem: Note 1: Although the Boogie file does not contain any axioms, the BoogiePreprocessor (our first preprocessing step) will introduce axiom to account for the
Note 2: The plugin rewrites all not equals relations. An optimization could be to rewrite only the relations that finally cause that an edge is split into two parallel edges. Note 3: While translating C to Boogie we do not (yet) introduce any axioms. Hence, programs with axioms are not tested very well. There are two known minor problems. These do however not affect the soundness but only the perfomance. |
For 2: If I remember correctly, some (non)termination proofs profit from a rewrite even if we do not split the edge. If you want to add a check that prevents rewrites if no split is possible, I would make it an option. |
Interesting. I do not have an explanation for such a behavior. If a (non)termination proof benefits from a rewrite without a split this must be due to a bug in the block encoding or the termination analysis. |
@martin-neuhaeusser I was still trying to find out why we cannot see the values for |
@Heizmann Did you use our |
@martin-neuhaeusser Yes, I did use the |
@martin-neuhaeusser There was definitely a bug that did not only exist in your branch. The bug caused the wrongly positioned program states and is now fixed on the |
* RewriteNotEquals utilized LassoRanker's TransitionPreprocessors to implement the rewriting. These TransitionPreprocessors do replace constants by "replacement variables". This replacement is only sound if you separately take care of axioms which was not done (cannot be done here) and if you do the replacement for all edges. * This problem lead to issue #596. * Now, the rewriting is done directly by TermTransformers. * I also removed `RemoveNegation` and the repeated application of NNF which seemd useless by now (maybe useless after 033cdcb)
Ok, I think I fixed the underlying problem in abfc54d. The commit message explains the problem. A minor problem that remains is the our counterexample run does not show values for constants. However, showing the values of constants requires some refactoring and I don't know if if values of constants are important for you @martin-neuhaeusser. (Furthermore, I this raises the question if values for constants should be shown after every step or only once. If we show values of constants only once, this raises the question whether variables of all variables in scope really be shown after each step or if we only want to see that variables that were recently re-assigned.) |
Basic Info
The following example requires the
boogie-steps
Branch. That branch combines the open PRs and enables handling of LTL attributes in Boogie (as used by the example).I hope (!) the bug is not related to our changes or our handling of LTL steps. It is triggered by changing a single setting of the large block encoding which - to my understanding - operates only on the product automaton and should therefore be independent of any LTL step annotations.
An archive with the Boogie file, the tool chain, the two settings files, and the resulting log-files is attached: rewrite_not_equals.tar.gz
Description
The example Boogie file
example_lbe_rewrite_not_equals.bpl
contains an LTL formula that is expected to betrue
.Running Ultimate Automizer with the
LTLAutomizer.xml
tool chain and the settings fromLTLAutomizer.epf
succeeds and proves the property.
However, setting the option
/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Rewrite\ not-equals=true
(as done inLTLAutomizer_fails.epf
and runningproduces a counterexample which I think is wrong.
Ultimate Automizer seems to fail tracking a chain of assignments of the
msgsender_MSG
variable which is initially assumed to be non-null and then takes a wrong branch checking for "nullness" of a variable that got populated indirectly bymsgsender_MSG
. To see that, start from the branch taking at the end of the counter-example (line 433) and go backwards. If I am not mistaken,spender_s637
cannot benull
(null = 0
) here due to the assumption in line 730.Question
The role of
rewrite_not_equals
is unclear to me - but I suppose it is expected to be equivalence preserving?The text was updated successfully, but these errors were encountered: