-
Notifications
You must be signed in to change notification settings - Fork 19
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
Add support for symbolic values containing mutable borrows #399
Merged
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Content
This PR adds proper support for symbolic values containing mutable borrows. This is a first step towards generalising the way the symbolic execution handles borrows, for instance to support nested borrows. In particular, this PR adds support for types like
[&'a mut T; 32]
, and enumerations containing borrows.We currently don't properly support instantiating functions with type parameters containing (mutable) borrows: I leave this as future work. In the meantime, I hacked support for instantiating
Box::new
with types containing borrows because this is really necessary to support interesting examples - I believe this can be generalised without too much work to an interesting class of functions.I still need to update the join operation to properly support those generalised symbolic values, but the good news is that as of today it is not necessary (because for instance when computing loops fixed points we rarely join two enumerations with different variants). In particular, I was able to (finally!) update the code of the hashmap so that the
get
andget_mut
functions now return options, instead of panicking if the key could not be found.Translation Examples
Consider the following mutable list type and its pop function:
The generated model is as follows:
The
push
function is more subtle:In the
push
function, the backward function needs to deconstruct the list to retrieve the head and the tail. In case the consumed value doesn't have the variantCons
(which should not happen if the backward function is properly used) we should fail, but I don't like the idea of having fallible backward functions, so rather we just use dummy values instead (in practice, I'm using the original values of the borrows):