Rollup merge of #75146 - tmiasko:range-overflow, r=Mark-Simulacrum
Detect overflow in proc_macro_server subspan * Detect overflow in proc_macro_server subspan * Add tests for overflow in Vec::drain * Add tests for overflow in String / VecDeque operations using ranges
This commit is contained in:
commit
fb9bb2b5ca
|
@ -584,12 +584,12 @@ impl server::Literal for Rustc<'_> {
|
|||
|
||||
let start = match start {
|
||||
Bound::Included(lo) => lo,
|
||||
Bound::Excluded(lo) => lo + 1,
|
||||
Bound::Excluded(lo) => lo.checked_add(1)?,
|
||||
Bound::Unbounded => 0,
|
||||
};
|
||||
|
||||
let end = match end {
|
||||
Bound::Included(hi) => hi + 1,
|
||||
Bound::Included(hi) => hi.checked_add(1)?,
|
||||
Bound::Excluded(hi) => hi,
|
||||
Bound::Unbounded => length,
|
||||
};
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#![feature(slice_ptr_get)]
|
||||
#![feature(split_inclusive)]
|
||||
#![feature(binary_heap_retain)]
|
||||
#![feature(deque_range)]
|
||||
#![feature(inplace_iteration)]
|
||||
#![feature(iter_map_while)]
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
use std::borrow::Cow;
|
||||
use std::collections::TryReserveError::*;
|
||||
use std::mem::size_of;
|
||||
use std::ops::Bound::*;
|
||||
|
||||
pub trait IntoCow<'a, B: ?Sized>
|
||||
where
|
||||
|
@ -467,6 +468,20 @@ fn test_drain() {
|
|||
assert_eq!(t, "");
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[should_panic]
|
||||
fn test_drain_start_overflow() {
|
||||
let mut s = String::from("abc");
|
||||
s.drain((Excluded(usize::MAX), Included(0)));
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[should_panic]
|
||||
fn test_drain_end_overflow() {
|
||||
let mut s = String::from("abc");
|
||||
s.drain((Included(0), Included(usize::MAX)));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_replace_range() {
|
||||
let mut s = "Hello, world!".to_owned();
|
||||
|
@ -504,6 +519,20 @@ fn test_replace_range_inclusive_out_of_bounds() {
|
|||
s.replace_range(5..=5, "789");
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[should_panic]
|
||||
fn test_replace_range_start_overflow() {
|
||||
let mut s = String::from("123");
|
||||
s.replace_range((Excluded(usize::MAX), Included(0)), "");
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[should_panic]
|
||||
fn test_replace_range_end_overflow() {
|
||||
let mut s = String::from("456");
|
||||
s.replace_range((Included(0), Included(usize::MAX)), "");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_replace_range_empty() {
|
||||
let mut s = String::from("12345");
|
||||
|
|
|
@ -3,6 +3,7 @@ use std::collections::TryReserveError::*;
|
|||
use std::fmt::Debug;
|
||||
use std::iter::InPlaceIterable;
|
||||
use std::mem::size_of;
|
||||
use std::ops::Bound::*;
|
||||
use std::panic::{catch_unwind, AssertUnwindSafe};
|
||||
use std::rc::Rc;
|
||||
use std::vec::{Drain, IntoIter};
|
||||
|
@ -645,6 +646,16 @@ fn test_drain_max_vec_size() {
|
|||
assert_eq!(v.len(), usize::MAX - 1);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[should_panic]
|
||||
fn test_drain_index_overflow() {
|
||||
let mut v = Vec::<()>::with_capacity(usize::MAX);
|
||||
unsafe {
|
||||
v.set_len(usize::MAX);
|
||||
}
|
||||
v.drain(0..=usize::MAX);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[should_panic]
|
||||
fn test_drain_inclusive_out_of_bounds() {
|
||||
|
@ -652,6 +663,20 @@ fn test_drain_inclusive_out_of_bounds() {
|
|||
v.drain(5..=5);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[should_panic]
|
||||
fn test_drain_start_overflow() {
|
||||
let mut v = vec![1, 2, 3];
|
||||
v.drain((Excluded(usize::MAX), Included(0)));
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[should_panic]
|
||||
fn test_drain_end_overflow() {
|
||||
let mut v = vec![1, 2, 3];
|
||||
v.drain((Included(0), Included(usize::MAX)));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_drain_leak() {
|
||||
static mut DROPS: i32 = 0;
|
||||
|
|
|
@ -2,6 +2,7 @@ use std::collections::TryReserveError::*;
|
|||
use std::collections::{vec_deque::Drain, VecDeque};
|
||||
use std::fmt::Debug;
|
||||
use std::mem::size_of;
|
||||
use std::ops::Bound::*;
|
||||
use std::panic::{catch_unwind, AssertUnwindSafe};
|
||||
|
||||
use crate::hash;
|
||||
|
@ -115,6 +116,20 @@ fn test_index_out_of_bounds() {
|
|||
deq[3];
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[should_panic]
|
||||
fn test_range_start_overflow() {
|
||||
let deq = VecDeque::from(vec![1, 2, 3]);
|
||||
deq.range((Included(0), Included(usize::MAX)));
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[should_panic]
|
||||
fn test_range_end_overflow() {
|
||||
let deq = VecDeque::from(vec![1, 2, 3]);
|
||||
deq.range((Excluded(usize::MAX), Included(0)));
|
||||
}
|
||||
|
||||
#[derive(Clone, PartialEq, Debug)]
|
||||
enum Taggy {
|
||||
One(i32),
|
||||
|
|
Loading…
Reference in New Issue