Revert "Fix panic in SparsityPattern::try_from_* if major index is out of bounds"

This reverts commit 12afe2917af4c30fc4a17316e453d0830072642c to avoid conflict with #1015.
This commit is contained in:
Fabian Loeschner 2021-11-09 14:07:57 +01:00
parent 38989ed5f0
commit 89f1e855bb
5 changed files with 6 additions and 29 deletions

View File

@ -550,9 +550,6 @@ fn pattern_format_error_to_csc_error(err: SparsityPatternFormatError) -> SparseF
K::InvalidStructure, K::InvalidStructure,
"Row indices are not monotonically increasing (sorted) within each column.", "Row indices are not monotonically increasing (sorted) within each column.",
), ),
MajorIndexOutOfBounds => {
E::from_kind_and_msg(K::IndexOutOfBounds, "Column indices are out of bounds.")
}
MinorIndexOutOfBounds => { MinorIndexOutOfBounds => {
E::from_kind_and_msg(K::IndexOutOfBounds, "Row indices are out of bounds.") E::from_kind_and_msg(K::IndexOutOfBounds, "Row indices are out of bounds.")
} }

View File

@ -622,9 +622,6 @@ fn pattern_format_error_to_csr_error(err: SparsityPatternFormatError) -> SparseF
K::InvalidStructure, K::InvalidStructure,
"Column indices are not monotonically increasing (sorted) within each row.", "Column indices are not monotonically increasing (sorted) within each row.",
), ),
MajorIndexOutOfBounds => {
E::from_kind_and_msg(K::IndexOutOfBounds, "Row indices are out of bounds.")
}
MinorIndexOutOfBounds => { MinorIndexOutOfBounds => {
E::from_kind_and_msg(K::IndexOutOfBounds, "Column indices are out of bounds.") E::from_kind_and_msg(K::IndexOutOfBounds, "Column indices are out of bounds.")
} }

View File

@ -157,9 +157,7 @@ impl SparsityPattern {
return Err(NonmonotonicOffsets); return Err(NonmonotonicOffsets);
} }
let minor_indices = minor_indices let minor_indices = &minor_indices[range_start..range_end];
.get(range_start..range_end)
.ok_or(MajorIndexOutOfBounds)?;
// We test for in-bounds, uniqueness and monotonicity at the same time // We test for in-bounds, uniqueness and monotonicity at the same time
// to ensure that we only visit each minor index once // to ensure that we only visit each minor index once
@ -280,8 +278,6 @@ pub enum SparsityPatternFormatError {
InvalidOffsetFirstLast, InvalidOffsetFirstLast,
/// Indicates that the major offsets are not monotonically increasing. /// Indicates that the major offsets are not monotonically increasing.
NonmonotonicOffsets, NonmonotonicOffsets,
/// One or more major indices are out of bounds.
MajorIndexOutOfBounds,
/// One or more minor indices are out of bounds. /// One or more minor indices are out of bounds.
MinorIndexOutOfBounds, MinorIndexOutOfBounds,
/// One or more duplicate entries were detected. /// One or more duplicate entries were detected.
@ -306,7 +302,7 @@ impl From<SparsityPatternFormatError> for SparseFormatError {
| NonmonotonicMinorIndices => { | NonmonotonicMinorIndices => {
SparseFormatError::from_kind_and_error(InvalidStructure, Box::from(err)) SparseFormatError::from_kind_and_error(InvalidStructure, Box::from(err))
} }
MajorIndexOutOfBounds | MinorIndexOutOfBounds => { MinorIndexOutOfBounds => {
SparseFormatError::from_kind_and_error(IndexOutOfBounds, Box::from(err)) SparseFormatError::from_kind_and_error(IndexOutOfBounds, Box::from(err))
} }
PatternDuplicateEntry => SparseFormatError::from_kind_and_error( PatternDuplicateEntry => SparseFormatError::from_kind_and_error(
@ -330,9 +326,6 @@ impl fmt::Display for SparsityPatternFormatError {
SparsityPatternFormatError::NonmonotonicOffsets => { SparsityPatternFormatError::NonmonotonicOffsets => {
write!(f, "Offsets are not monotonically increasing.") write!(f, "Offsets are not monotonically increasing.")
} }
SparsityPatternFormatError::MajorIndexOutOfBounds => {
write!(f, "A major index is out of bounds.")
}
SparsityPatternFormatError::MinorIndexOutOfBounds => { SparsityPatternFormatError::MinorIndexOutOfBounds => {
write!(f, "A minor index is out of bounds.") write!(f, "A minor index is out of bounds.")
} }

View File

@ -58,7 +58,6 @@ fn pattern_deserialize_invalid() {
assert!(serde_json::from_str::<SparsityPattern>(r#"{"major_dim":3,"minor_dim":6,"major_offsets":[0, 2, 2, 5],"minor_indices":[0, 2, 3, 1, 4]}"#).is_err()); assert!(serde_json::from_str::<SparsityPattern>(r#"{"major_dim":3,"minor_dim":6,"major_offsets":[0, 2, 2, 5],"minor_indices":[0, 2, 3, 1, 4]}"#).is_err());
assert!(serde_json::from_str::<SparsityPattern>(r#"{"major_dim":3,"minor_dim":6,"major_offsets":[0, 2, 2, 5],"minor_indices":[0, 6, 1, 2, 3]}"#).is_err()); assert!(serde_json::from_str::<SparsityPattern>(r#"{"major_dim":3,"minor_dim":6,"major_offsets":[0, 2, 2, 5],"minor_indices":[0, 6, 1, 2, 3]}"#).is_err());
assert!(serde_json::from_str::<SparsityPattern>(r#"{"major_dim":3,"minor_dim":6,"major_offsets":[0, 2, 2, 5],"minor_indices":[0, 5, 2, 2, 3]}"#).is_err()); assert!(serde_json::from_str::<SparsityPattern>(r#"{"major_dim":3,"minor_dim":6,"major_offsets":[0, 2, 2, 5],"minor_indices":[0, 5, 2, 2, 3]}"#).is_err());
assert!(serde_json::from_str::<SparsityPattern>(r#"{"major_dim":3,"minor_dim":6,"major_offsets":[0, 10, 2, 5],"minor_indices":[0, 5, 1, 2, 3]}"#).is_err());
} }
#[test] #[test]
@ -149,7 +148,8 @@ fn csc_deserialize_invalid() {
assert!(serde_json::from_str::<CscMatrix<i32>>(r#"{"nrows":6,"ncols":3,"col_offsets":[0,2,2,5],"row_indices":[0,5,1,2,3],"values":[0,1,2,3,4,5]}"#).is_err()); assert!(serde_json::from_str::<CscMatrix<i32>>(r#"{"nrows":6,"ncols":3,"col_offsets":[0,2,2,5],"row_indices":[0,5,1,2,3],"values":[0,1,2,3,4,5]}"#).is_err());
assert!(serde_json::from_str::<CscMatrix<i32>>(r#"{"nrows":6,"ncols":3,"col_offsets":[0,2,2,5],"row_indices":[0,5,1,8,3],"values":[0,1,2,3,4]}"#).is_err()); assert!(serde_json::from_str::<CscMatrix<i32>>(r#"{"nrows":6,"ncols":3,"col_offsets":[0,2,2,5],"row_indices":[0,5,1,8,3],"values":[0,1,2,3,4]}"#).is_err());
assert!(serde_json::from_str::<CscMatrix<i32>>(r#"{"nrows":6,"ncols":3,"col_offsets":[0,2,2,5],"row_indices":[0,5,1,2,3,1,1],"values":[0,1,2,3,4]}"#).is_err()); assert!(serde_json::from_str::<CscMatrix<i32>>(r#"{"nrows":6,"ncols":3,"col_offsets":[0,2,2,5],"row_indices":[0,5,1,2,3,1,1],"values":[0,1,2,3,4]}"#).is_err());
assert!(serde_json::from_str::<CscMatrix<i32>>(r#"{"nrows":6,"ncols":3,"col_offsets":[0,10,2,5],"row_indices":[0,5,1,2,3],"values":[0,1,2,3,4]}"#).is_err()); // The following actually panics ('range end index 10 out of range for slice of length 5', nalgebra-sparse\src\pattern.rs:156:38)
//assert!(serde_json::from_str::<CscMatrix<i32>>(r#"{"nrows":6,"ncols":3,"col_offsets":[0,10,2,5],"row_indices":[0,5,1,2,3],"values":[0,1,2,3,4]}"#).is_err());
assert!(serde_json::from_str::<CscMatrix<i32>>(r#"{"nrows":3,"ncols":6,"row_offsets":[0,2,2,5],"col_indices":[0,5,1,2,3],"values":[0,1,2,3,4]}"#).is_err()); assert!(serde_json::from_str::<CscMatrix<i32>>(r#"{"nrows":3,"ncols":6,"row_offsets":[0,2,2,5],"col_indices":[0,5,1,2,3],"values":[0,1,2,3,4]}"#).is_err());
} }
@ -188,7 +188,8 @@ fn csr_deserialize_invalid() {
assert!(serde_json::from_str::<CsrMatrix<i32>>(r#"{"nrows":3,"ncols":6,"row_offsets":[0,2,2,5],"col_indices":[0,5,1,2,3],"values":[0,1,2,3,4,5]}"#).is_err()); assert!(serde_json::from_str::<CsrMatrix<i32>>(r#"{"nrows":3,"ncols":6,"row_offsets":[0,2,2,5],"col_indices":[0,5,1,2,3],"values":[0,1,2,3,4,5]}"#).is_err());
assert!(serde_json::from_str::<CsrMatrix<i32>>(r#"{"nrows":3,"ncols":6,"row_offsets":[0,2,2,5],"col_indices":[0,5,1,8,3],"values":[0,1,2,3,4]}"#).is_err()); assert!(serde_json::from_str::<CsrMatrix<i32>>(r#"{"nrows":3,"ncols":6,"row_offsets":[0,2,2,5],"col_indices":[0,5,1,8,3],"values":[0,1,2,3,4]}"#).is_err());
assert!(serde_json::from_str::<CsrMatrix<i32>>(r#"{"nrows":3,"ncols":6,"row_offsets":[0,2,2,5],"col_indices":[0,5,1,2,3,1,1],"values":[0,1,2,3,4]}"#).is_err()); assert!(serde_json::from_str::<CsrMatrix<i32>>(r#"{"nrows":3,"ncols":6,"row_offsets":[0,2,2,5],"col_indices":[0,5,1,2,3,1,1],"values":[0,1,2,3,4]}"#).is_err());
assert!(serde_json::from_str::<CsrMatrix<i32>>(r#"{"nrows":3,"ncols":6,"row_offsets":[0,10,2,5],"col_indices":[0,5,1,2,3],"values":[0,1,2,3,4]}"#).is_err()); // The following actually panics ('range end index 10 out of range for slice of length 5', nalgebra-sparse\src\pattern.rs:156:38)
//assert!(serde_json::from_str::<CsrMatrix<i32>>(r#"{"nrows":3,"ncols":6,"row_offsets":[0,10,2,5],"col_indices":[0,5,1,2,3],"values":[0,1,2,3,4]}"#).is_err());
assert!(serde_json::from_str::<CsrMatrix<i32>>(r#"{"nrows":6,"ncols":3,"col_offsets":[0,2,2,5],"row_indices":[0,5,1,2,3],"values":[0,1,2,3,4]}"#).is_err()); assert!(serde_json::from_str::<CsrMatrix<i32>>(r#"{"nrows":6,"ncols":3,"col_offsets":[0,2,2,5],"row_indices":[0,5,1,2,3],"values":[0,1,2,3,4]}"#).is_err());
} }

View File

@ -133,17 +133,6 @@ fn sparsity_pattern_try_from_invalid_data() {
); );
} }
{
// Major index out of bounds
let offsets = vec![0, 10, 2, 5];
let indices = vec![0, 1, 2, 3, 4];
let pattern = SparsityPattern::try_from_offsets_and_indices(3, 6, offsets, indices);
assert_eq!(
pattern,
Err(SparsityPatternFormatError::MajorIndexOutOfBounds)
);
}
{ {
// Minor index out of bounds // Minor index out of bounds
let offsets = vec![0, 2, 2, 5]; let offsets = vec![0, 2, 2, 5];