From f3ce1edfb27ccc43313f26e55f06e0b15df93ab9 Mon Sep 17 00:00:00 2001 From: Nick Babcock Date: Fri, 15 Dec 2023 06:33:45 -0600 Subject: [PATCH] Add miri to CI, fixup text tape pointer arithmetic --- .github/workflows/rust.yml | 9 ++++++++- src/text/tape.rs | 23 ++++++++++++----------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index c6e8cdc..64590cb 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -74,7 +74,14 @@ jobs: - name: Compile benchmarks if: matrix.build == 'stable' run: cargo bench --verbose --no-run $TARGET - + + - name: Run miri + if: matrix.build == 'nightly' + run: | + rustup toolchain install nightly --component miri + cargo miri setup + MIRIFLAGS="-Zmiri-disable-stacked-borrows" cargo miri test + - name: Compile fuzz if: matrix.build == 'nightly' run: | diff --git a/src/text/tape.rs b/src/text/tape.rs index 79ec125..30b1d7d 100644 --- a/src/text/tape.rs +++ b/src/text/tape.rs @@ -306,7 +306,7 @@ fn split_at_scalar(d: &[u8]) -> (Scalar, &[u8]) { use core::arch::x86_64::*; let start_ptr = d.as_ptr(); let loop_size = std::mem::size_of::<__m128i>(); - let end_ptr = d[d.len()..].as_ptr().sub(loop_size); + let end_ptr = d.as_ptr_range().end.sub(loop_size.min(d.len())); let mut ptr = start_ptr; // Here we use SIMD instructions to detect certain bytes. @@ -357,7 +357,7 @@ fn split_at_scalar(d: &[u8]) -> (Scalar, &[u8]) { // { = 0x7b // } = 0x7d // * = unknown if boundary character. Can be removed for perf - while ptr <= end_ptr { + while ptr < end_ptr { let input = _mm_loadu_si128(ptr as *const __m128i); let t0 = _mm_cmpeq_epi8(input, _mm_set1_epi8(9)); let mut result = t0; @@ -439,25 +439,26 @@ impl<'a, 'b> ParserState<'a, 'b> { #[inline] fn skip_ws_t(&mut self, data: &'a [u8]) -> Option<&'a [u8]> { unsafe { - let start_ptr = data.as_ptr(); - let end_ptr = start_ptr.add(data.len()); - + let start_ptr = data.as_ptr_range().start; + let end_ptr = data.as_ptr_range().end; let mut ptr = start_ptr; while ptr < end_ptr { match *ptr { b' ' | b'\t' | b'\n' | b'\r' | b';' => {} - b'#' => { - ptr = ptr.offset(1); - while ptr < end_ptr && *ptr != b'\n' { - ptr = ptr.offset(1); + b'#' => loop { + ptr = ptr.add(1); + if ptr == end_ptr { + return None; + } else if *ptr == b'\n' { + break; } - } + }, _ => { let rest = std::slice::from_raw_parts(ptr, sub(end_ptr, ptr)); return Some(rest); } } - ptr = ptr.offset(1); + ptr = ptr.add(1); } }