Closed PetarMax closed 7 months ago
I can confirm that this issue persists in the latest version of the booster that's made its way into K (88ffab54a7266d8c98d5c039ef81143d1d24f3f0
).
Important to know: There is a 2nd rule that produces the #markAsFailed ~> ...
which has the dual side condition notBool #matchReason(REASON, #encodeOutput(OUT))
.
Therefore it was relatively easy to narrow this down to differences in the evaluation of #matchReason
, and ultimately #encodeOutput
.
Note the leading sequence of \u0000
(x 31) in the kore
value, followed by a space (char 32 ), followed by the suffix produced by booster
I tested by evaluating encodeOutput
manually and sending a number of its sub-expressions to the simplifier, then I discovered what is probably happening here:
While evaluating encodeArgs(#bytes(...))
(as part of the call to encodeOutput
), we have two rules for encodeArgsAux
, depending on whether an argument is of static or dynamic type:
However, the definition of #isStaticType
appears to be lacking an [owise]
on the last equation.
The LLVM backend will arbitrarily choose one of the alternatives (I am not sure how, actually), and apparently is choosing the wrong one in this particular case.
Would it be possible to re-test this with an evm-semantics
from https://github.com/runtimeverification/evm-semantics/pull/2371 ?
I can confirm that the rule is correctly applied now. Thank you, @jberthold!
I am in a configuration where I’m getting this with the booster
and this with the Haskell backend
with the Haskell backend being correct. The bug reports from both are attached. The rule in question is this:
the relevant configuration is this
and I have a claim, proven using
kprove
, which confirms that#matchReason(REASON, #encodeOutput(OUT))
holds.bug-hb.tar.gz bug-booster.tar.gz