From f6161f41081dcb8a87ec13f40c4d8cd0e6739184 Mon Sep 17 00:00:00 2001 From: Heinz Gies Date: Wed, 20 Mar 2024 08:47:57 +0100 Subject: [PATCH 1/3] Fix #371 possible panic in fuzzing Signed-off-by: Heinz Gies --- src/numberparse/correct.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/numberparse/correct.rs b/src/numberparse/correct.rs index 5f26073e..f9088a77 100644 --- a/src/numberparse/correct.rs +++ b/src/numberparse/correct.rs @@ -9,9 +9,8 @@ use super::{is_made_of_eight_digits_fast, parse_eight_digits_unrolled}; use crate::charutils::is_structural_or_whitespace; use crate::error::Error; use crate::safer_unchecked::GetSaferUnchecked; -use crate::unlikely; use crate::StaticNode; -use crate::{static_cast_i64, Deserializer, ErrorType, Result}; +use crate::{Deserializer, ErrorType, Result}; macro_rules! get { ($buf:ident, $idx:expr) => { @@ -92,7 +91,9 @@ impl<'de> Deserializer<'de> { idx += 1; let first_after_period = idx as i64; if is_integer(get!(buf, idx)) { - num = 10_u64.wrapping_mul(num) + u64::from(get!(buf, idx) - b'0'); + num = 10_u64 + .wrapping_mul(num) + .wrapping_add(u64::from(get!(buf, idx) - b'0')); idx += 1; } else { err!(idx, get!(buf, idx)) @@ -111,7 +112,9 @@ impl<'de> Deserializer<'de> { } } while is_integer(get!(buf, idx)) { - num = 10_u64.wrapping_mul(num) + u64::from(get!(buf, idx) - b'0'); + num = 10_u64 + .wrapping_mul(num) + .wrapping_add(u64::from(get!(buf, idx) - b'0')); idx += 1; } exponent = first_after_period.wrapping_sub(idx as i64); From 8f4a9c261caf50a69a22fff88d3ac5ea074ca7c0 Mon Sep 17 00:00:00 2001 From: Heinz Gies Date: Wed, 20 Mar 2024 08:48:17 +0100 Subject: [PATCH 2/3] Clean up new clippies Signed-off-by: Heinz Gies --- src/impls/avx2/stage1.rs | 6 ------ src/impls/native/stage1.rs | 4 ---- src/impls/neon/deser.rs | 2 +- src/impls/neon/stage1.rs | 5 ----- src/impls/portable/stage1.rs | 5 ----- src/impls/simd128/stage1.rs | 5 ----- src/impls/sse42/stage1.rs | 6 ------ src/lib.rs | 3 +-- src/numberparse.rs | 2 +- src/serde.rs | 4 +--- src/serde/de.rs | 2 +- src/serde/se.rs | 3 +-- src/serde/se/pp.rs | 3 +-- src/serde/value/borrowed/de.rs | 1 - src/serde/value/borrowed/se.rs | 1 + src/serde/value/owned/de.rs | 1 - src/serde/value/owned/se.rs | 1 + src/tests/serde.rs | 4 ++-- src/value/borrowed.rs | 2 +- src/value/borrowed/from.rs | 1 - src/value/borrowed/serialize.rs | 4 +--- src/value/owned.rs | 2 +- src/value/owned/from.rs | 1 - src/value/owned/serialize.rs | 3 +-- src/value/tape/array.rs | 21 ++++++++++++++------- src/value/tape/cmp.rs | 2 +- src/value/tape/object.rs | 8 ++++++++ 27 files changed, 38 insertions(+), 64 deletions(-) diff --git a/src/impls/avx2/stage1.rs b/src/impls/avx2/stage1.rs index 0e146591..c072ee47 100644 --- a/src/impls/avx2/stage1.rs +++ b/src/impls/avx2/stage1.rs @@ -232,10 +232,4 @@ impl Stage1Parse for SimdInput { unsafe fn fill_s8(n: i8) -> __m256i { _mm256_set1_epi8(n) } - - #[cfg_attr(not(feature = "no-inline"), inline)] - #[target_feature(enable = "avx2")] - unsafe fn zero() -> __m256i { - _mm256_setzero_si256() - } } diff --git a/src/impls/native/stage1.rs b/src/impls/native/stage1.rs index 62e6c532..0417286b 100644 --- a/src/impls/native/stage1.rs +++ b/src/impls/native/stage1.rs @@ -478,8 +478,4 @@ impl Stage1Parse for SimdInput { unsafe fn fill_s8(n: i8) -> V128 { u8x16_splat(n as u8) } - - unsafe fn zero() -> V128 { - u8x16_splat(0) - } } diff --git a/src/impls/neon/deser.rs b/src/impls/neon/deser.rs index ecd3b3f9..3782cf29 100644 --- a/src/impls/neon/deser.rs +++ b/src/impls/neon/deser.rs @@ -48,9 +48,9 @@ pub(crate) fn parse_str<'invoke, 'de>( buffer: &'invoke mut [u8], mut idx: usize, ) -> Result<&'de str> { + use ErrorType::{InvalidEscape, InvalidUnicodeCodepoint}; let input = input.input; - use ErrorType::{InvalidEscape, InvalidUnicodeCodepoint}; // Add 1 to skip the initial " idx += 1; //let mut read: usize = 0; diff --git a/src/impls/neon/stage1.rs b/src/impls/neon/stage1.rs index 69721c50..2f46bc54 100644 --- a/src/impls/neon/stage1.rs +++ b/src/impls/neon/stage1.rs @@ -220,9 +220,4 @@ impl Stage1Parse for SimdInput { unsafe fn fill_s8(n: i8) -> int8x16_t { vdupq_n_s8(n) } - - #[cfg_attr(not(feature = "no-inline"), inline)] - unsafe fn zero() -> int8x16_t { - vdupq_n_s8(0) - } } diff --git a/src/impls/portable/stage1.rs b/src/impls/portable/stage1.rs index 9c15d324..bd9eb557 100644 --- a/src/impls/portable/stage1.rs +++ b/src/impls/portable/stage1.rs @@ -165,9 +165,4 @@ impl Stage1Parse for SimdInput { #[allow(clippy::cast_sign_loss)] u8x64::splat(n as u8) } - - #[cfg_attr(not(feature = "no-inline"), inline)] - unsafe fn zero() -> u8x64 { - u8x64::splat(0) - } } diff --git a/src/impls/simd128/stage1.rs b/src/impls/simd128/stage1.rs index 5f847e8b..5d7d83ec 100644 --- a/src/impls/simd128/stage1.rs +++ b/src/impls/simd128/stage1.rs @@ -200,9 +200,4 @@ impl Stage1Parse for SimdInput { unsafe fn fill_s8(n: i8) -> v128 { i8x16_splat(n) } - - #[cfg_attr(not(feature = "no-inline"), inline)] - unsafe fn zero() -> v128 { - i8x16_splat(0) - } } diff --git a/src/impls/sse42/stage1.rs b/src/impls/sse42/stage1.rs index 3fff64c0..3bb007a0 100644 --- a/src/impls/sse42/stage1.rs +++ b/src/impls/sse42/stage1.rs @@ -276,10 +276,4 @@ impl Stage1Parse for SimdInput { unsafe fn fill_s8(n: i8) -> __m128i { _mm_set1_epi8(n) } - - #[target_feature(enable = "sse4.2")] - #[cfg_attr(not(feature = "no-inline"), inline)] - unsafe fn zero() -> __m128i { - _mm_setzero_si128() - } } diff --git a/src/lib.rs b/src/lib.rs index 8ca8ace8..695ea4b6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -378,7 +378,6 @@ pub(crate) trait Stage1Parse { } unsafe fn fill_s8(n: i8) -> Self::SimdRepresentation; - unsafe fn zero() -> Self::SimdRepresentation; } /// Deserializer struct to deserialize a JSON @@ -929,7 +928,7 @@ impl<'de> Deserializer<'de> { self.idx += 1; } - /// Same as next() but we pull out the check so we don't need to + /// Same as `next()` but we pull out the check so we don't need to /// stry every time. Use this only if you know the next element exists! /// /// # Safety diff --git a/src/numberparse.rs b/src/numberparse.rs index 0e0daa75..ecefdf44 100644 --- a/src/numberparse.rs +++ b/src/numberparse.rs @@ -115,7 +115,7 @@ fn parse_eight_digits_unrolled(chars: &[u8]) -> u32 { ))] #[allow(clippy::cast_ptr_alignment)] fn parse_eight_digits_unrolled(chars: &[u8]) -> u32 { - let val = unsafe { (chars.as_ptr() as *const u64).read_unaligned() }; // memcpy(&val, chars, sizeof(u64)); + let val = unsafe { chars.as_ptr().cast::().read_unaligned() }; // memcpy(&val, chars, sizeof(u64)); let val = (val & 0x0F0F_0F0F_0F0F_0F0F).wrapping_mul(2561) >> 8; let val = (val & 0x00FF_00FF_00FF_00FF).wrapping_mul(6_553_601) >> 16; diff --git a/src/serde.rs b/src/serde.rs index 8a9febb6..a6d295a0 100644 --- a/src/serde.rs +++ b/src/serde.rs @@ -11,12 +11,10 @@ mod se; mod value; pub use self::se::*; pub use self::value::*; -use crate::{stry, Buffers, Deserializer, Error, ErrorType, Result}; +use crate::{stry, Buffers, Deserializer, Error, ErrorType, Node, Result}; use crate::{BorrowedValue, OwnedValue}; -use crate::{Node, StaticNode}; use serde::de::DeserializeOwned; use serde_ext::Deserialize; -use std::convert::{TryFrom, TryInto}; use std::fmt; use std::io; use value_trait::prelude::*; diff --git a/src/serde/de.rs b/src/serde/de.rs index 57823ebc..c5c9fba8 100644 --- a/src/serde/de.rs +++ b/src/serde/de.rs @@ -1,5 +1,5 @@ use crate::serde_ext::de::IntoDeserializer; -use crate::{serde_ext, stry, Deserializer, Error, ErrorType, Node, Result, StaticNode}; +use crate::{stry, Deserializer, Error, ErrorType, Node, Result, StaticNode}; use serde_ext::de::{self, DeserializeSeed, MapAccess, SeqAccess, Visitor}; use serde_ext::forward_to_deserialize_any; use std::str; diff --git a/src/serde/se.rs b/src/serde/se.rs index e9f6d853..b1962866 100644 --- a/src/serde/se.rs +++ b/src/serde/se.rs @@ -1,9 +1,8 @@ mod pp; -use crate::{serde_ext, Error, ErrorType}; +use crate::{Error, ErrorType}; pub use pp::*; use serde_ext::ser; use std::io::Write; -use std::result::Result; use std::str; use value_trait::generator::BaseGenerator; diff --git a/src/serde/se/pp.rs b/src/serde/se/pp.rs index 186881cc..1c45dff6 100644 --- a/src/serde/se/pp.rs +++ b/src/serde/se/pp.rs @@ -1,7 +1,6 @@ -use crate::{serde_ext, stry, Error, ErrorType}; +use crate::{stry, Error, ErrorType}; use serde_ext::ser; use std::io::Write; -use std::result::Result; use std::str; use value_trait::generator::BaseGenerator; diff --git a/src/serde/value/borrowed/de.rs b/src/serde/value/borrowed/de.rs index 14c74fbd..c445fe18 100644 --- a/src/serde/value/borrowed/de.rs +++ b/src/serde/value/borrowed/de.rs @@ -1,7 +1,6 @@ // A lot of this logic is a re-implementation or copy of serde_json::Value use crate::Error; use crate::ObjectHasher; -use crate::StaticNode; use crate::{cow::Cow, ErrorType}; use crate::{ prelude::*, diff --git a/src/serde/value/borrowed/se.rs b/src/serde/value/borrowed/se.rs index 22aaeea3..64a065ed 100644 --- a/src/serde/value/borrowed/se.rs +++ b/src/serde/value/borrowed/se.rs @@ -682,6 +682,7 @@ mod test { struct Map { key: u32, } + #[allow(clippy::struct_field_names)] #[derive(Deserialize, Serialize, PartialEq, Debug, Default)] struct Obj { v_i128: i128, diff --git a/src/serde/value/owned/de.rs b/src/serde/value/owned/de.rs index 6c6d4e46..da23d6eb 100644 --- a/src/serde/value/owned/de.rs +++ b/src/serde/value/owned/de.rs @@ -1,6 +1,5 @@ // A lot of this logic is a re-implementation or copy of serde_json::Value use crate::ErrorType; -use crate::StaticNode; use crate::{ prelude::*, serde::value::shared::MapKeyDeserializer, diff --git a/src/serde/value/owned/se.rs b/src/serde/value/owned/se.rs index 83c3789a..596a1c3c 100644 --- a/src/serde/value/owned/se.rs +++ b/src/serde/value/owned/se.rs @@ -618,6 +618,7 @@ mod test { #[derive(Debug, Serialize, Deserialize)] struct TestPoint(f64, f64); + #[allow(clippy::struct_field_names)] #[derive(Deserialize, Serialize, PartialEq, Debug, Default)] struct Obj { v_i128: i128, diff --git a/src/tests/serde.rs b/src/tests/serde.rs index 1bfc7b38..61f80368 100644 --- a/src/tests/serde.rs +++ b/src/tests/serde.rs @@ -922,7 +922,7 @@ proptest! { .. ProptestConfig::default() })] #[test] - // #[allow(clippy::should_panic_without_expect)] + #[allow(clippy::should_panic_without_expect)] #[should_panic] fn prop_junk(d in arb_junk()) { let mut d1 = d.clone(); @@ -947,7 +947,7 @@ proptest! { })] #[test] - // #[allow(clippy::should_panic_without_expect)] + #[allow(clippy::should_panic_without_expect)] #[should_panic] fn prop_string(d in "\\PC*") { let mut d1 = d.clone(); diff --git a/src/value/borrowed.rs b/src/value/borrowed.rs index 87ca6036..11698132 100644 --- a/src/value/borrowed.rs +++ b/src/value/borrowed.rs @@ -27,7 +27,7 @@ mod serialize; use super::ObjectHasher; use crate::cow::Cow; use crate::{prelude::*, Buffers}; -use crate::{Deserializer, Node, Result, StaticNode}; +use crate::{Deserializer, Node, Result}; use halfbrown::HashMap; use std::fmt; use std::ops::{Index, IndexMut}; diff --git a/src/value/borrowed/from.rs b/src/value/borrowed/from.rs index bb09767d..9327d35d 100644 --- a/src/value/borrowed/from.rs +++ b/src/value/borrowed/from.rs @@ -2,7 +2,6 @@ use super::{Object, Value}; use crate::cow::Cow; use crate::OwnedValue; use crate::StaticNode; -use std::iter::FromIterator; impl<'value> From for Value<'value> { #[cfg_attr(not(feature = "no-inline"), inline)] diff --git a/src/value/borrowed/serialize.rs b/src/value/borrowed/serialize.rs index 03ad42a1..ca9fb068 100644 --- a/src/value/borrowed/serialize.rs +++ b/src/value/borrowed/serialize.rs @@ -6,12 +6,10 @@ use super::{Object, Value}; use crate::prelude::*; -use crate::stry; -use crate::StaticNode; use std::io; use std::io::Write; use value_trait::generator::{ - BaseGenerator, DumpGenerator, PrettyGenerator, PrettyWriterGenerator, WriterGenerator, + DumpGenerator, PrettyGenerator, PrettyWriterGenerator, WriterGenerator, }; //use util::print_dec; diff --git a/src/value/owned.rs b/src/value/owned.rs index 648e395d..2ac8e18c 100644 --- a/src/value/owned.rs +++ b/src/value/owned.rs @@ -25,7 +25,7 @@ mod serialize; use super::ObjectHasher; use crate::{prelude::*, Buffers}; -use crate::{Deserializer, Node, Result, StaticNode}; +use crate::{Deserializer, Node, Result}; use halfbrown::HashMap; use std::fmt; use std::ops::{Index, IndexMut}; diff --git a/src/value/owned/from.rs b/src/value/owned/from.rs index 7210b0ad..bd65dea6 100644 --- a/src/value/owned/from.rs +++ b/src/value/owned/from.rs @@ -1,6 +1,5 @@ use super::{Object, Value}; use crate::{BorrowedValue, StaticNode}; -use std::iter::FromIterator; impl From> for Value { #[cfg_attr(not(feature = "no-inline"), inline)] diff --git a/src/value/owned/serialize.rs b/src/value/owned/serialize.rs index 007b12e6..85fd295d 100644 --- a/src/value/owned/serialize.rs +++ b/src/value/owned/serialize.rs @@ -6,11 +6,10 @@ use super::{Object, Value}; use crate::prelude::*; -use crate::{stry, StaticNode}; use std::io; use std::io::Write; use value_trait::generator::{ - BaseGenerator, DumpGenerator, PrettyGenerator, PrettyWriterGenerator, WriterGenerator, + DumpGenerator, PrettyGenerator, PrettyWriterGenerator, WriterGenerator, }; //use util::print_dec; diff --git a/src/value/tape/array.rs b/src/value/tape/array.rs index 728c1315..caf1e6ae 100644 --- a/src/value/tape/array.rs +++ b/src/value/tape/array.rs @@ -7,6 +7,16 @@ pub struct Array<'tape, 'input>(pub(super) &'tape [Node<'input>]); pub struct ArrayIter<'tape, 'input>(&'tape [Node<'input>]); +impl<'tape, 'input> Iterator for ArrayIter<'tape, 'input> { + type Item = Value<'tape, 'input>; + + fn next(&mut self) -> Option { + let (head, tail) = self.0.split_at(self.0.first()?.count()); + self.0 = tail; + Some(Value(head)) + } +} + // value_trait::Array for impl<'tape, 'input> Array<'tape, 'input> where @@ -48,16 +58,13 @@ where } } -impl<'tape, 'input> Iterator for ArrayIter<'tape, 'input> { +impl<'tape, 'input> IntoIterator for &Array<'tape, 'input> { + type IntoIter = ArrayIter<'tape, 'input>; type Item = Value<'tape, 'input>; - - fn next(&mut self) -> Option { - let (head, tail) = self.0.split_at(self.0.first()?.count()); - self.0 = tail; - Some(Value(head)) + fn into_iter(self) -> Self::IntoIter { + self.iter() } } - #[cfg(test)] mod test { use crate::to_tape; diff --git a/src/value/tape/cmp.rs b/src/value/tape/cmp.rs index 038ef5bb..4517fc7e 100644 --- a/src/value/tape/cmp.rs +++ b/src/value/tape/cmp.rs @@ -181,7 +181,7 @@ where if object.len() != other.len() { return false; } - for (key, value) in object.iter() { + for (key, value) in &object { if !other.get(key).map_or(false, |v| v == &value) { return false; } diff --git a/src/value/tape/object.rs b/src/value/tape/object.rs index 393313a7..b52caa9c 100644 --- a/src/value/tape/object.rs +++ b/src/value/tape/object.rs @@ -68,6 +68,14 @@ impl<'tape, 'input> Object<'tape, 'input> { } } +impl<'tape, 'input> IntoIterator for &Object<'tape, 'input> { + type IntoIter = ObjectIter<'tape, 'input>; + type Item = (&'input str, Value<'tape, 'input>); + fn into_iter(self) -> Self::IntoIter { + self.iter() + } +} + impl<'tape, 'input> Iterator for ObjectIter<'tape, 'input> { type Item = (&'input str, Value<'tape, 'input>); From 973d640270d3e982ad715f8bea1bea2924db1806 Mon Sep 17 00:00:00 2001 From: Heinz Gies Date: Wed, 20 Mar 2024 08:59:00 +0100 Subject: [PATCH 3/3] Fix nightly clippy errors Signed-off-by: Heinz Gies --- src/macros.rs | 2 +- src/serde.rs | 1 - src/serde/value/borrowed/se.rs | 1 - src/serde/value/owned/se.rs | 1 - src/value/borrowed/serialize.rs | 1 - src/value/owned/serialize.rs | 2 +- src/value/tape/array.rs | 1 + tests/serenity.rs | 4 +--- 8 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/macros.rs b/src/macros.rs index b9a00823..35f9009f 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -1314,7 +1314,7 @@ macro_rules! stry { #[cfg(test)] mod test { use crate::prelude::*; - use crate::{json, json_typed, BorrowedValue, OwnedValue}; + use crate::{BorrowedValue, OwnedValue}; #[cfg(feature = "serde_impl")] fn owned_test_map() -> OwnedValue { diff --git a/src/serde.rs b/src/serde.rs index a6d295a0..303d6d46 100644 --- a/src/serde.rs +++ b/src/serde.rs @@ -481,7 +481,6 @@ mod test { use serde::{Deserialize, Serialize}; use serde_json::{json as sjson, to_string as sto_string, Value as SerdeValue}; use std::collections::BTreeMap; - use std::convert::TryInto; #[derive(Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] struct UnitStruct; diff --git a/src/serde/value/borrowed/se.rs b/src/serde/value/borrowed/se.rs index 64a065ed..513f05c8 100644 --- a/src/serde/value/borrowed/se.rs +++ b/src/serde/value/borrowed/se.rs @@ -608,7 +608,6 @@ mod test { use super::Value; use crate::{borrowed::Object, serde::from_slice, ObjectHasher}; use serde::{Deserialize, Serialize}; - use serde_json; use value_trait::StaticNode; #[test] diff --git a/src/serde/value/owned/se.rs b/src/serde/value/owned/se.rs index 596a1c3c..f38e97e6 100644 --- a/src/serde/value/owned/se.rs +++ b/src/serde/value/owned/se.rs @@ -585,7 +585,6 @@ mod test { #[cfg(not(target_arch = "wasm32"))] use crate::serde::{from_str, to_string}; use serde::{Deserialize, Serialize}; - use serde_json; #[derive(Debug, Default, PartialEq, Eq, Hash, Serialize, Deserialize)] struct UnitStruct; diff --git a/src/value/borrowed/serialize.rs b/src/value/borrowed/serialize.rs index ca9fb068..bae9c99a 100644 --- a/src/value/borrowed/serialize.rs +++ b/src/value/borrowed/serialize.rs @@ -233,7 +233,6 @@ where mod test { use super::Value; use crate::prelude::*; - use crate::StaticNode; #[test] fn null() { diff --git a/src/value/owned/serialize.rs b/src/value/owned/serialize.rs index 85fd295d..3ef60046 100644 --- a/src/value/owned/serialize.rs +++ b/src/value/owned/serialize.rs @@ -235,7 +235,7 @@ where mod test { use super::Value; use crate::prelude::*; - use crate::StaticNode; + #[test] fn null() { assert_eq!(Value::Static(StaticNode::Null).encode(), "null"); diff --git a/src/value/tape/array.rs b/src/value/tape/array.rs index caf1e6ae..e7c683e1 100644 --- a/src/value/tape/array.rs +++ b/src/value/tape/array.rs @@ -65,6 +65,7 @@ impl<'tape, 'input> IntoIterator for &Array<'tape, 'input> { self.iter() } } + #[cfg(test)] mod test { use crate::to_tape; diff --git a/tests/serenity.rs b/tests/serenity.rs index c154b1b3..ef5c64c8 100644 --- a/tests/serenity.rs +++ b/tests/serenity.rs @@ -2,11 +2,9 @@ mod test { pub(crate) mod snowflake { - use std::convert::TryFrom; - use std::fmt; - use serde::de::{Error, Visitor}; use serde::{Deserializer, Serializer}; + use std::fmt; pub fn deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result { deserializer.deserialize_any(SnowflakeVisitor)