diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 285b04b..7532199 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -43,7 +43,10 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Run tests - run: cargo test + run: | + cargo clippy --all-targets --all-features -- -D warnings + cargo fmt --all -- --check + cargo test miri: runs-on: ${{ matrix.os }} @@ -111,7 +114,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Test with ASAN - run: cargo test --tests --target x86_64-unknown-linux-gnu + run: cargo test --tests --target x86_64-unknown-linux-gnu --features asan env: RUST_TARGET: x86_64-unknown-linux-gnu RUST_BACKTRACE: 1 diff --git a/Cargo.toml b/Cargo.toml index 4073608..1fc0439 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,6 +18,7 @@ path = "examples/escape.rs" [features] codspeed = ["criterion2/codspeed"] +asan = [] # for ASAN [[bench]] name = "escape" diff --git a/src/lib.rs b/src/lib.rs index a3e2e8f..12d3644 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -521,8 +521,16 @@ mod tests { for i in 0u8..32 { let s = String::from_utf8(vec![i]).unwrap(); let result = escape(&s); - let expected = serde_json::to_string(&s).unwrap(); - assert_eq!(result, expected, "Failed for byte 0x{:02x}", i); + let expected = String::from_utf8(QUOTE_TAB[i as usize].1.to_vec()) + .unwrap() + .trim_end_matches('\0') + .to_string(); + assert_eq!( + result, + format!("\"{}\"", expected), + "Failed for byte 0x{:02x}", + i + ); } } diff --git a/src/simd/avx2.rs b/src/simd/avx2.rs index c1cac44..db581ad 100644 --- a/src/simd/avx2.rs +++ b/src/simd/avx2.rs @@ -232,7 +232,7 @@ pub unsafe fn format_string(value: &str, dst: &mut [u8]) -> usize { std::ptr::copy_nonoverlapping(sptr, placeholder[..].as_mut_ptr(), nb); Simd256u::loadu(placeholder[..].as_ptr()) } else { - #[cfg(any(debug_assertions, miri))] + #[cfg(any(debug_assertions, miri, feature = "asan"))] { std::ptr::copy_nonoverlapping(sptr, placeholder[..].as_mut_ptr(), nb); Simd256u::loadu(placeholder[..].as_ptr()) diff --git a/src/simd/avx512.rs b/src/simd/avx512.rs index a1ac242..e165894 100644 --- a/src/simd/avx512.rs +++ b/src/simd/avx512.rs @@ -225,7 +225,7 @@ pub unsafe fn format_string(value: &str, dst: &mut [u8]) -> usize { std::ptr::copy_nonoverlapping(sptr, placeholder[..].as_mut_ptr(), nb); Simd512u::loadu(placeholder[..].as_ptr()) } else { - #[cfg(any(debug_assertions, miri))] + #[cfg(any(debug_assertions, miri, feature = "asan"))] { std::ptr::copy_nonoverlapping(sptr, placeholder[..].as_mut_ptr(), nb); Simd512u::loadu(placeholder[..].as_ptr()) diff --git a/src/simd/neon.rs b/src/simd/neon.rs index 0300fc1..a177c77 100644 --- a/src/simd/neon.rs +++ b/src/simd/neon.rs @@ -233,7 +233,7 @@ pub unsafe fn format_string(value: &str, dst: &mut [u8]) -> usize { std::ptr::copy_nonoverlapping(sptr, placeholder[..].as_mut_ptr(), nb); Simd128u::loadu(placeholder[..].as_ptr()) } else { - #[cfg(any(debug_assertions, miri))] + #[cfg(any(debug_assertions, miri, feature = "asan"))] { std::ptr::copy_nonoverlapping(sptr, placeholder[..].as_mut_ptr(), nb); Simd128u::loadu(placeholder[..].as_ptr()) diff --git a/src/simd/sse2.rs b/src/simd/sse2.rs index cdcc112..45d42b0 100644 --- a/src/simd/sse2.rs +++ b/src/simd/sse2.rs @@ -229,7 +229,7 @@ pub unsafe fn format_string(value: &str, dst: &mut [u8]) -> usize { std::ptr::copy_nonoverlapping(sptr, placeholder[..].as_mut_ptr(), nb); Simd128u::loadu(placeholder[..].as_ptr()) } else { - #[cfg(any(debug_assertions, miri))] + #[cfg(any(debug_assertions, miri, feature = "asan"))] { std::ptr::copy_nonoverlapping(sptr, placeholder[..].as_mut_ptr(), nb); Simd128u::loadu(placeholder[..].as_ptr()) diff --git a/src/simd/v128.rs b/src/simd/v128.rs index 0e20392..5ed04d1 100644 --- a/src/simd/v128.rs +++ b/src/simd/v128.rs @@ -161,7 +161,7 @@ pub fn format_string(value: &str, dst: &mut [u8]) -> usize { std::ptr::copy_nonoverlapping(sptr, placeholder[..].as_mut_ptr(), nb); Simd128u::loadu(placeholder[..].as_ptr()) } else { - #[cfg(any(debug_assertions, miri))] + #[cfg(any(debug_assertions, miri, feature = "asan"))] { std::ptr::copy_nonoverlapping(sptr, placeholder[..].as_mut_ptr(), nb); Simd128u::loadu(placeholder[..].as_ptr())