2
2
// Copyright 2015 Andrew Gallant, bluss and Nicolas Koch
3
3
4
4
use crate :: intrinsics:: const_eval_select;
5
+ use crate :: kani;
5
6
6
7
const LO_USIZE : usize = usize:: repeat_u8 ( 0x01 ) ;
7
8
const HI_USIZE : usize = usize:: repeat_u8 ( 0x80 ) ;
@@ -36,7 +37,7 @@ const fn memchr_naive(x: u8, text: &[u8]) -> Option<usize> {
36
37
let mut i = 0 ;
37
38
38
39
// FIXME(const-hack): Replace with `text.iter().pos(|c| *c == x)`.
39
- #[ safety :: loop_invariant( i <= text. len( ) && kani:: forall!( |j in ( 0 , i) | unsafe { * text. as_ptr( ) . wrapping_add( j) } != x) ) ]
40
+ #[ kani :: loop_invariant( i <= text. len( ) && kani:: forall!( |j in ( 0 , i) | unsafe { * text. as_ptr( ) . wrapping_add( j) } != x) ) ]
40
41
while i < text. len ( ) {
41
42
if text[ i] == x {
42
43
return Some ( i) ;
@@ -79,7 +80,7 @@ const fn memchr_aligned(x: u8, text: &[u8]) -> Option<usize> {
79
80
80
81
// search the body of the text
81
82
let repeated_x = usize :: repeat_u8( x) ;
82
- #[ safety :: loop_invariant( len >= 2 * USIZE_BYTES && offset <= len &&
83
+ #[ kani :: loop_invariant( len >= 2 * USIZE_BYTES && offset <= len &&
83
84
kani:: forall!( |j in ( 0 , offset) | unsafe { * text. as_ptr( ) . wrapping_add( j) } != x) ) ]
84
85
while offset <= len - 2 * USIZE_BYTES {
85
86
// SAFETY: the while's predicate guarantees a distance of at least 2 * usize_bytes
@@ -142,7 +143,7 @@ pub fn memrchr(x: u8, text: &[u8]) -> Option<usize> {
142
143
let repeated_x = usize:: repeat_u8 ( x) ;
143
144
let chunk_bytes = size_of :: < Chunk > ( ) ;
144
145
145
- #[ safety :: loop_invariant( true ) ]
146
+ #[ kani :: loop_invariant( true ) ]
146
147
while offset > min_aligned_offset {
147
148
// SAFETY: offset starts at len - suffix.len(), as long as it is greater than
148
149
// min_aligned_offset (prefix.len()) the remaining distance is at least 2 * chunk_bytes.
@@ -168,7 +169,6 @@ pub fn memrchr(x: u8, text: &[u8]) -> Option<usize> {
168
169
#[ unstable( feature = "kani" , issue = "none" ) ]
169
170
pub mod verify {
170
171
use super :: * ;
171
- use crate :: kani;
172
172
173
173
#[ kani:: proof]
174
174
#[ kani:: solver( cvc5) ]
0 commit comments