Skip to content

Commit 1b1cfe6

Browse files
author
Fedor Ryabinin
committed
LLM-generated contracts for __iterator_get_unchecked
1 parent 177d0fd commit 1b1cfe6

12 files changed

Lines changed: 102 additions & 0 deletions

File tree

library/alloc/src/collections/vec_deque/iter.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
#![feature(ub_checks)]
2+
use safety::{ensures,requires};
3+
#[cfg(kani)]
4+
#[unstable(feature="kani", issue="none")]
5+
use core::kani;
6+
#[allow(unused_imports)]
7+
#[unstable(feature = "ub_checks", issue = "none")]
8+
use core::ub_checks::*;
9+
110
use core::iter::{FusedIterator, TrustedLen, TrustedRandomAccess, TrustedRandomAccessNoCoerce};
211
use core::num::NonZero;
312
use core::ops::Try;
@@ -144,6 +153,8 @@ impl<'a, T> Iterator for Iter<'a, T> {
144153
}
145154

146155
#[inline]
156+
#[requires(idx < self.len())]
157+
#[cfg_attr(kani, kani::modifies(self))]
147158
unsafe fn __iterator_get_unchecked(&mut self, idx: usize) -> Self::Item {
148159
// Safety: The TrustedRandomAccess contract requires that callers only pass an index
149160
// that is in bounds.

library/alloc/src/collections/vec_deque/iter_mut.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
#![feature(ub_checks)]
2+
use safety::{ensures,requires};
3+
#[cfg(kani)]
4+
#[unstable(feature="kani", issue="none")]
5+
use core::kani;
6+
#[allow(unused_imports)]
7+
#[unstable(feature = "ub_checks", issue = "none")]
8+
use core::ub_checks::*;
9+
110
use core::iter::{FusedIterator, TrustedLen, TrustedRandomAccess, TrustedRandomAccessNoCoerce};
211
use core::num::NonZero;
312
use core::ops::Try;
@@ -208,6 +217,8 @@ impl<'a, T> Iterator for IterMut<'a, T> {
208217
}
209218

210219
#[inline]
220+
#[requires(idx < self.len())]
221+
#[cfg_attr(kani, kani::modifies(self))]
211222
unsafe fn __iterator_get_unchecked(&mut self, idx: usize) -> Self::Item {
212223
// Safety: The TrustedRandomAccess contract requires that callers only pass an index
213224
// that is in bounds.

library/alloc/src/vec/into_iter.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
#![feature(ub_checks)]
2+
use safety::{ensures,requires};
3+
#[cfg(kani)]
4+
#[unstable(feature="kani", issue="none")]
5+
use core::kani;
6+
#[allow(unused_imports)]
7+
#[unstable(feature = "ub_checks", issue = "none")]
8+
use core::ub_checks::*;
9+
110
use core::iter::{
211
FusedIterator, InPlaceIterable, SourceIter, TrustedFused, TrustedLen,
312
TrustedRandomAccessNoCoerce,
@@ -354,6 +363,8 @@ impl<T, A: Allocator> Iterator for IntoIter<T, A> {
354363
R::from_output(accum)
355364
}
356365

366+
#[requires(i < self.len())]
367+
#[cfg_attr(kani, kani::modifies(self))]
357368
unsafe fn __iterator_get_unchecked(&mut self, i: usize) -> Self::Item
358369
where
359370
Self: TrustedRandomAccessNoCoerce,

library/core/src/array/iter.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
//! Defines the `IntoIter` owned iterator for arrays.
22
3+
use safety::{ensures,requires};
4+
#[cfg(kani)]
5+
use crate::kani;
6+
#[allow(unused_imports)]
7+
use crate::ub_checks::*;
8+
39
use crate::intrinsics::transmute_unchecked;
410
use crate::iter::{FusedIterator, TrustedLen, TrustedRandomAccessNoCoerce};
511
use crate::mem::MaybeUninit;
@@ -138,6 +144,8 @@ impl<T, const N: usize> IntoIter<T, N> {
138144
/// ```
139145
#[unstable(feature = "array_into_iter_constructors", issue = "91583")]
140146
#[inline]
147+
#[requires(initialized.start <= initialized.end)]
148+
#[requires(initialized.end <= N)]
141149
pub const unsafe fn new_unchecked(
142150
buffer: [MaybeUninit<T>; N],
143151
initialized: Range<usize>,
@@ -279,6 +287,8 @@ impl<T, const N: usize> Iterator for IntoIter<T, N> {
279287
}
280288

281289
#[inline]
290+
#[requires(idx < self.len())]
291+
#[cfg_attr(kani, kani::modifies(self))]
282292
unsafe fn __iterator_get_unchecked(&mut self, idx: usize) -> Self::Item {
283293
// SAFETY: The caller must provide an idx that is in bound of the remainder.
284294
let elem_ref = unsafe { self.as_mut_slice().get_unchecked_mut(idx) };

library/core/src/char/mod.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@ pub use self::methods::encode_utf16_raw; // perma-unstable
4141
pub use self::methods::{encode_utf8_raw, encode_utf8_raw_unchecked}; // perma-unstable
4242

4343
#[rustfmt::skip]
44+
use safety::{ensures,requires};
45+
#[cfg(kani)]
46+
use crate::kani;
47+
#[allow(unused_imports)]
48+
use crate::ub_checks::*;
49+
4450
use crate::ascii;
4551
pub(crate) use self::methods::EscapeDebugExtArgs;
4652
use crate::error::Error;
@@ -138,6 +144,7 @@ pub const fn from_u32(i: u32) -> Option<char> {
138144
#[rustc_const_stable(feature = "const_char_from_u32_unchecked", since = "1.81.0")]
139145
#[must_use]
140146
#[inline]
147+
#[requires(i <= 0x10FFFF && (i < 0xD800 || i > 0xDFFF))]
141148
pub const unsafe fn from_u32_unchecked(i: u32) -> char {
142149
// SAFETY: the safety contract must be upheld by the caller.
143150
unsafe { self::convert::from_u32_unchecked(i) }
@@ -533,6 +540,8 @@ impl Iterator for CaseMappingIter {
533540
self.0.advance_by(n)
534541
}
535542

543+
#[requires(idx < self.len())]
544+
#[cfg_attr(kani, kani::modifies(self))]
536545
unsafe fn __iterator_get_unchecked(&mut self, idx: usize) -> Self::Item {
537546
// SAFETY: just forwarding requirements to caller
538547
unsafe { self.0.__iterator_get_unchecked(idx) }

library/core/src/iter/adapters/cloned.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
use safety::{ensures,requires};
2+
#[cfg(kani)]
3+
use crate::kani;
4+
#[allow(unused_imports)]
5+
use crate::ub_checks::*;
6+
17
use core::num::NonZero;
28

39
use crate::iter::adapters::zip::try_get_unchecked;
@@ -61,6 +67,7 @@ where
6167
self.it.map(T::clone).fold(init, f)
6268
}
6369

70+
#[requires(idx < self.it.size_hint().0)]
6471
unsafe fn __iterator_get_unchecked(&mut self, idx: usize) -> T
6572
where
6673
Self: TrustedRandomAccessNoCoerce,

library/core/src/iter/adapters/enumerate.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
use safety::{ensures,requires};
2+
#[cfg(kani)]
3+
use crate::kani;
4+
#[allow(unused_imports)]
5+
use crate::ub_checks::*;
6+
17
use crate::iter::adapters::zip::try_get_unchecked;
28
use crate::iter::adapters::{SourceIter, TrustedRandomAccess, TrustedRandomAccessNoCoerce};
39
use crate::iter::{FusedIterator, InPlaceIterable, TrustedFused, TrustedLen};
@@ -160,6 +166,7 @@ where
160166

161167
#[rustc_inherit_overflow_checks]
162168
#[inline]
169+
#[cfg_attr(kani, kani::modifies(self))]
163170
unsafe fn __iterator_get_unchecked(&mut self, idx: usize) -> <Self as Iterator>::Item
164171
where
165172
Self: TrustedRandomAccessNoCoerce,

library/core/src/iter/adapters/fuse.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
use safety::{ensures,requires};
2+
#[cfg(kani)]
3+
use crate::kani;
4+
#[allow(unused_imports)]
5+
use crate::ub_checks::*;
6+
17
use crate::intrinsics;
28
use crate::iter::adapters::SourceIter;
39
use crate::iter::adapters::zip::try_get_unchecked;
@@ -109,6 +115,7 @@ where
109115
}
110116

111117
#[inline]
118+
#[cfg_attr(kani, kani::modifies(self))]
112119
unsafe fn __iterator_get_unchecked(&mut self, idx: usize) -> Self::Item
113120
where
114121
Self: TrustedRandomAccessNoCoerce,

library/core/src/iter/adapters/map.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
use safety::{ensures,requires};
2+
#[cfg(kani)]
3+
use crate::kani;
4+
#[allow(unused_imports)]
5+
use crate::ub_checks::*;
6+
17
use crate::fmt;
28
use crate::iter::adapters::zip::try_get_unchecked;
39
use crate::iter::adapters::{SourceIter, TrustedRandomAccess, TrustedRandomAccessNoCoerce};
@@ -129,6 +135,7 @@ where
129135
}
130136

131137
#[inline]
138+
#[requires(idx < self.iter.size_hint().0)]
132139
unsafe fn __iterator_get_unchecked(&mut self, idx: usize) -> B
133140
where
134141
Self: TrustedRandomAccessNoCoerce,

library/core/src/iter/adapters/skip.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
use safety::{ensures,requires};
2+
#[cfg(kani)]
3+
use crate::kani;
4+
#[allow(unused_imports)]
5+
use crate::ub_checks::*;
6+
17
use crate::intrinsics::unlikely;
28
use crate::iter::adapters::SourceIter;
39
use crate::iter::adapters::zip::try_get_unchecked;
@@ -158,6 +164,7 @@ where
158164
}
159165

160166
#[doc(hidden)]
167+
#[cfg_attr(kani, kani::modifies(self))]
161168
unsafe fn __iterator_get_unchecked(&mut self, idx: usize) -> Self::Item
162169
where
163170
Self: TrustedRandomAccessNoCoerce,

0 commit comments

Comments
 (0)