Skip to content

Time reasoning#1275

Closed
Pialex99 wants to merge 26 commits intoviperproject:masterfrom
Pialex99:time-reasoning
Closed

Time reasoning#1275
Pialex99 wants to merge 26 commits intoviperproject:masterfrom
Pialex99:time-reasoning

Conversation

@Pialex99
Copy link

@Pialex99 Pialex99 commented Jan 6, 2023

Add time reasoning functionality.

  • The error reporting is a bit hacky but it works.
  • Does not work on pure functions and closures.
  • Quadratic runtime does not work because z3 can't handle it out of the box.

Comment on lines +97 to +98
}) => if b {
conjunct
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@vakaras If we inline a dummy trigger function body (with the body true) and also simplify, this would change semantics of quantifiers. Do you know in what order the inlining is performed?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, this can be a problem. For this and other reasons, it is better to use domain functions as triggers (with an axiom that says its value is always true).


use prusti_contracts::*;

// ignore-test: prusti-constract functions used outside specification check not yet implemented
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure about "not yet" here: we don't want to implement something like this. Many specification functions don't make sense in executable code, and branching on time_credits or receipts is also such an example. I would remove this test.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As they don't make sense in executable code why don't we report them when we find them?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Because nobody has implemented that feature yet...


use prusti_contracts::*;

// ignore-test: prusti-constract functions used outside specification check not yet implemented
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove this test.

fn safe_array_cmp<T: Eq>(a: &[T], b: &[T]) -> bool {
let mut i = 0;
let mut res = true;
while i < a.len() {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why don't we need to put time_credits in the invariant?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Prusti didn't complain so I thought I didn't have to and the loop.rs tests were passing without so I thought that it was okay but playing a bit with the generated Viper code showed me that it doesn't 😅


use prusti_contracts::*;

// This test checks that setting the time reasoning option to false ignores timing constrains
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As written in another comment, I don't think this should be the behaviour. This test also isn't even fully testing what the comment says: there is no timing specification to "ignore", only the default zero permissions.

@Aurel300
Copy link
Member

Superseded by #1408.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants