Skip to content

Commit ab5df22

Browse files
committed
Make compatible with new Verus that enforces termination checking
1 parent 937b680 commit ab5df22

File tree

10 files changed

+57
-4
lines changed

10 files changed

+57
-4
lines changed

ironsht/src/args_t.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ ensures
3131
i <= v.len(),
3232
i == out.len(),
3333
forall |j| #![auto] 0 <= j < i ==> out@[j] == v@[j],
34+
decreases
35+
v.len() - i,
3436
{
3537
out.push(v[i]);
3638
i = i + 1;

ironsht/src/delegation_map_v.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,8 @@ impl<K: KeyTrait + VerusClone> StrictlyOrderedVec<K> {
233233
deleted_set == old(self)@.subrange(start as int, start as int + deleted as int).to_set(),
234234
deleted_set.len() == deleted,
235235
old(self)@.to_set() == self@.to_set() + deleted_set,
236+
decreases
237+
end - start - deleted,
236238
{
237239
let ghost mut old_deleted_set;
238240
let ghost mut old_deleted_seq;
@@ -299,6 +301,8 @@ impl<K: KeyTrait + VerusClone> StrictlyOrderedVec<K> {
299301
invariant
300302
0 <= index <= self@.len(),
301303
forall |i| 0 <= i < index ==> (#[trigger] self@.index(i).cmp_spec(k)).lt()
304+
decreases
305+
self@.len() - index
302306
{
303307
index = index + 1;
304308
}
@@ -437,6 +441,8 @@ pub fn vec_erase<A>(v: &mut Vec<A>, start: usize, end: usize)
437441
v@.len() == old(v)@.len() - deleted,
438442
0 <= deleted <= end - start,
439443
v@ == old(v)@.subrange(0, start as int) + old(v)@.subrange(start as int + deleted as int, old(v)@.len() as int),
444+
decreases
445+
end - start - deleted
440446
{
441447
v.remove(start);
442448
deleted = deleted + 1;
@@ -539,6 +545,7 @@ impl<K: KeyTrait + VerusClone> StrictlyOrderedMap<K> {
539545
let mut i = 0;
540546
while i < self.keys.len()
541547
invariant forall |j| 0 <= j < i ==> self.keys@[j] != k,
548+
decreases self.keys@.len() - i
542549
{
543550
//println!("Loop {} of find_key", i);
544551
if self.keys.index(i).cmp(&k).is_eq() {
@@ -571,8 +578,11 @@ impl<K: KeyTrait + VerusClone> StrictlyOrderedMap<K> {
571578
while i <= hi
572579
invariant
573580
lo <= i,
581+
self.keys@.len() <= usize::MAX,
574582
hi < self.keys@.len() as usize == self.vals@.len(),
575583
forall |j| #![auto] lo <= j < i ==> self.vals@[j]@ == v@,
584+
decreases
585+
self.keys@.len() - i
576586
{
577587
let eq = do_end_points_match(&self.vals[i], v);
578588
if !eq {
@@ -788,6 +798,8 @@ impl<K: KeyTrait + VerusClone> StrictlyOrderedMap<K> {
788798
|| (i < self.keys@.len() &&
789799
!iter.geq_K(self.keys@.index(i as int)) &&
790800
forall |j:nat| j < i ==> iter.geq_K(#[trigger]self.keys@.index(j as int))),
801+
decreases
802+
self.keys@.len() - i
791803
{
792804
if iter.lt(&KeyIterator::new(self.keys.index(i))) {
793805
// Reached a key that's too large
@@ -884,6 +896,8 @@ impl<K: KeyTrait + VerusClone> StrictlyOrderedMap<K> {
884896
self.valid(),
885897
0 <= start <= self.keys@.len(),
886898
forall |j| #![auto] 0 <= j < start ==> lo.above(self.keys@.index(j))
899+
decreases
900+
self.keys@.len() - start
887901
{
888902
start = start + 1;
889903
}
@@ -895,6 +909,8 @@ impl<K: KeyTrait + VerusClone> StrictlyOrderedMap<K> {
895909
self.valid(),
896910
start <= end <= self.keys@.len(),
897911
forall |j| #![auto] start <= j < end ==> hi.above(self.keys@[j])
912+
decreases
913+
self.keys@.len() - end
898914
{
899915
end = end + 1;
900916
}

ironsht/src/host_impl_v.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -302,11 +302,13 @@ impl HostState {
302302
let mut i: usize = 0;
303303

304304
while i<args.len()
305-
invariant
305+
invariant
306306
i <= args.len(),
307307
end_points.len() == i,
308308
forall |j| #![auto] 0 <= j < i ==> parse_arg_as_end_point(abstractify_args(*args)[j]) == end_points@[j]@,
309309
forall |j| #![auto] 0 <= j < i ==> end_points@[j]@.valid_physical_address(),
310+
decreases
311+
args.len() - i
310312
{
311313
let end_point = Self::parse_end_point(&(*args)[i]);
312314
if !end_point.valid_physical_address() {

ironsht/src/main_t.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ verus! {
2626
pub struct IronError {
2727
}
2828

29+
#[verifier::exec_allows_no_decreases_clause]
2930
// net_impl comes from outside so this function can be verified.
3031
pub fn sht_main(netc: NetClient, args: Args) -> Result<(), IronError>
3132
requires

ironsht/src/marshal_ironsht_specific_v.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@ verus! {
109109
invariant
110110
(0 < idx <= v.len()),
111111
(forall |i: int, j: int| 0 <= i && i + 1 < idx && j == i+1 ==> #[trigger] ckeykvlt(v@[i], v@[j])),
112+
decreases
113+
v.len() - idx
112114
{
113115
if v[idx - 1].k.ukey >= v[idx].k.ukey {
114116
assert(!ckeykvlt(v@[idx as int-1], v@[idx as int]));

ironsht/src/marshal_v.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,8 @@ impl Marshalable for u64 {
156156
data@.subrange(0, old(data)@.len() as int) == old(data)@,
157157
data@.subrange(old(data)@.len() as int, data@.len() as int) == self.ghost_serialize().subrange(0, i as int),
158158
data@.len() == old(data)@.len() + i as int,
159+
decreases
160+
8 - i
159161
{
160162
assert(data@.subrange(old(data)@.len() as int, data@.len() as int) == data@.subrange(old(data)@.len() as int, old(data)@.len() + i as int));
161163

@@ -343,6 +345,8 @@ impl Marshalable for Vec<u8> {
343345
data@.subrange(0, old(data)@.len() as int) == old(data)@,
344346
data@.subrange(old(data)@.len() as int, data@.len() as int) == self.ghost_serialize().subrange(0, i + init@),
345347
data@.len() == old(data)@.len() + i + init@,
348+
decreases
349+
self.len() - i
346350
{
347351
assert(data@.subrange(old(data)@.len() as int, data@.len() as int) == data@.subrange(old(data)@.len() as int, old(data)@.len() + i + init@));
348352

@@ -633,6 +637,8 @@ impl<T: Marshalable> Marshalable for Vec<T> {
633637
res ==> (forall |x: T| self@.subrange(0, i as int).contains(x) ==> #[trigger] x.is_marshalable()),
634638
res ==> total_len as int <= usize::MAX,
635639
!res ==> !self.is_marshalable(),
640+
decreases
641+
self.len() - i + if res { 1int } else { 0int }
636642
{
637643
assert(res);
638644
res = res && self[i]._is_marshalable() && (usize::MAX - total_len >= self[i].serialized_size());
@@ -704,6 +710,8 @@ impl<T: Marshalable> Marshalable for Vec<T> {
704710
self@.subrange(0 as int, self@.len() as int).fold_left(0, |acc: int, x: T| acc + x.ghost_serialize().len()) <= usize::MAX,
705711
res == (self@.len() as usize).ghost_serialize().len() +
706712
self@.subrange(0 as int, i as int).fold_left(0, |acc: int, x: T| acc + x.ghost_serialize().len()),
713+
decreases
714+
self.len() - i
707715
{
708716
proof {
709717
let f = |x: T| x.ghost_serialize();
@@ -765,6 +773,8 @@ impl<T: Marshalable> Marshalable for Vec<T> {
765773
self@.subrange(0, i as int).fold_left(Seq::<u8>::empty(), |acc: Seq<u8>, x: T| acc + x.ghost_serialize()),
766774
forall |x: T| self@.contains(x) ==> #[trigger] x.is_marshalable(),
767775
data@.len() >= old(data)@.len(),
776+
decreases
777+
self.len() - i
768778
{
769779
self[i].serialize(data);
770780
i = i + 1;
@@ -833,6 +843,8 @@ impl<T: Marshalable> Marshalable for Vec<T> {
833843
len.ghost_serialize().len() +
834844
res@.fold_left(0, |acc: int, x: T| acc + x.ghost_serialize().len()) == end - start,
835845
accf@ == |acc: Seq<u8>, x: T| acc + x.ghost_serialize(),
846+
decreases
847+
len - i
836848
{
837849
let (x, end1) = match T::deserialize(data, end) { None => {
838850
return None;

ironsht/src/net_sht_v.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,8 @@ ensures
386386
send_log_entries_reflect_packets(net_events, cpackets@.subrange(0, i as int)),
387387
only_sent_marshalable_data(net_events),
388388
forall |i| 0 <= i < net_events.len() ==> net_events[i] is Send,
389+
decreases
390+
cpackets.len() - i
389391
{
390392
let cpacket: &CPacket = &cpackets[i];
391393
let (ok, Ghost(net_event)) = send_packet(cpacket, netc);

ironsht/src/seq_is_unique_v.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ verus! {
3636
i <= e1.len(),
3737
e1.len() == e2.len(),
3838
forall |j: int| 0 <= j && j < i ==> e1@[j] == e2@[j]
39+
decreases
40+
e1.len() - i
3941
{
4042
if e1[i] != e2[i] {
4143
return false;
@@ -67,6 +69,8 @@ verus! {
6769
i <= endpoints.len(),
6870
forall |j: int, k: int| #![trigger endpoints@[j]@, endpoints@[k]@]
6971
0 <= j && j < endpoints.len() && 0 <= k && k < i && j != k ==> endpoints@[j]@ != endpoints@[k]@,
72+
decreases
73+
endpoints.len() - i
7074
{
7175
let mut j: usize = 0;
7276
while j < endpoints.len()
@@ -78,6 +82,8 @@ verus! {
7882
0 <= j,
7983
j <= endpoints.len(),
8084
forall |k: int| #![trigger endpoints@[k]@] 0 <= k && k < j && k != i ==> endpoints@[i as int]@ != endpoints@[k]@,
85+
decreases
86+
endpoints.len() - j
8187
{
8288
if i != j && do_end_points_match(&endpoints[i], &endpoints[j]) {
8389
assert (!seq_is_unique(abstractify_end_points(*endpoints))) by {
@@ -107,6 +113,8 @@ verus! {
107113
invariant
108114
0 <= j && j <= endpoints.len(),
109115
forall |k: int| #![trigger endpoints@[k]@] 0 <= k && k < j ==> endpoint@ != endpoints@[k]@,
116+
decreases
117+
endpoints.len() - j
110118
{
111119
if do_end_points_match(endpoint, &endpoints[j]) {
112120
assert (abstractify_end_points(*endpoints)[j as int] == endpoint@);

ironsht/src/single_delivery_model_v.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ impl CSingleDelivery {
127127
let mut i=0;
128128

129129
while i < ack_state.un_acked.len()
130-
invariant
130+
invariant
131131
0 <= i <= ack_state.un_acked.len(),
132132
self.valid(), // Everybody hates having to carry everything through here. :v(
133133
src.abstractable(),
@@ -138,6 +138,8 @@ impl CSingleDelivery {
138138
packets@.map_values(|p: CPacket| p@).to_set() ==
139139
old(packets)@.map_values(|p: CPacket| p@).to_set() + self@.un_acked_messages_for_dest_up_to(src@, dst@, i as nat),
140140
Self::packets_are_valid_messages(packets@),
141+
decreases
142+
ack_state.un_acked.len() - i
141143
{
142144
let ghost packets0_view = packets@;
143145

@@ -552,7 +554,7 @@ impl CSingleDelivery {
552554
}
553555

554556
while dst_i < dests.len()
555-
invariant
557+
invariant
556558
self.valid(), // Everybody hates having to carry everything through here. :v(
557559
dests@.map_values(|ep: EndPoint| ep@).to_set() == self.send_state.epmap@.dom(), // NOTE: hard to figure this one out: this comes from postcondition of .keys(). Losing while context extra sad here because it was very painful to reconstruct.
558560
src.abstractable(),
@@ -562,6 +564,8 @@ impl CSingleDelivery {
562564
packets@.map_values(|p: CPacket| p@).to_set() ==
563565
self@.un_acked_messages_for_dests(src@, dests@.subrange(0, dst_i as int).map_values(|ep: EndPoint| ep@).to_set()),
564566
Self::packets_are_valid_messages(packets@),
567+
decreases
568+
dests.len() - dst_i
565569
{
566570
let ghost packets0_view = packets@;
567571

ironsht/src/single_delivery_state_v.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ impl CAckState {
6767
i <= self.un_acked.len(),
6868
un_acked@.len() == i as nat,
6969
forall |j: int| 0 <= j < i as nat ==> #[trigger] (un_acked@[j]@) == self.un_acked@[j]@
70+
decreases
71+
self.un_acked.len() - i
7072
{
7173
un_acked.push(self.un_acked[i].clone_up_to_view());
7274
i = i + 1;
@@ -171,7 +173,7 @@ impl CAckState {
171173
true
172174
},
173175
})
174-
invariant
176+
invariant
175177
self.valid(dst),
176178
self == old(self),
177179
i <= self.un_acked.len(),
@@ -181,6 +183,8 @@ impl CAckState {
181183
truncate_un_ack_list(abstractify_cmessage_seq(self.un_acked@.skip(i as int)), seqno_acked as nat)
182184
== truncate_un_ack_list(abstractify_cmessage_seq(old(self).un_acked@), seqno_acked as nat),
183185
self.num_packets_acked + i <= seqno_acked,
186+
decreases
187+
self.un_acked.len() - i
184188
{
185189
assert( self.un_acked@.skip(i as int).skip(1) =~= self.un_acked@.skip((i + 1) as int) );
186190
i = i + 1;

0 commit comments

Comments
 (0)