mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 00:03:43 +00:00
7fb81229d3
Fix `VecDeque::shrink_to` UB when `handle_alloc_error` unwinds. Fixes #123369 For `VecDeque` it's relatively simple to restore the buffer into a consistent state so this PR does just that. Note that with its current implementation, `shrink_to` may change the internal arrangement of elements in the buffer, so e.g. `[D, <uninit>, A, B, C]` will become `[<uninit>, A, B, C, D]` and `[<uninit>, <uninit>, A, B, C]` may become `[B, C, <uninit>, <uninit>, A]` if `shrink_to` unwinds. This shouldn't be an issue though as we don't make any guarantees about the stability of the internal buffer arrangement (and this case is impossible to hit on stable anyways). This PR also includes a test with code adapted from #123369 which fails without the new `shrink_to` code. Does this suffice or do we maybe need more exhaustive tests like in #108475? cc `@Amanieu` `@rustbot` label +T-libs
58 lines
1.6 KiB
TOML
58 lines
1.6 KiB
TOML
[package]
|
|
name = "alloc"
|
|
version = "0.0.0"
|
|
license = "MIT OR Apache-2.0"
|
|
repository = "https://github.com/rust-lang/rust.git"
|
|
description = "The Rust core allocation and collections library"
|
|
autotests = false
|
|
autobenches = false
|
|
edition = "2021"
|
|
|
|
[dependencies]
|
|
core = { path = "../core" }
|
|
compiler_builtins = { version = "0.1.40", features = ['rustc-dep-of-std'] }
|
|
|
|
[dev-dependencies]
|
|
rand = { version = "0.8.5", default-features = false, features = ["alloc"] }
|
|
rand_xorshift = "0.3.0"
|
|
|
|
[[test]]
|
|
name = "alloctests"
|
|
path = "tests/lib.rs"
|
|
|
|
[[test]]
|
|
name = "vec_deque_alloc_error"
|
|
path = "tests/vec_deque_alloc_error.rs"
|
|
|
|
[[bench]]
|
|
name = "allocbenches"
|
|
path = "benches/lib.rs"
|
|
test = true
|
|
|
|
[[bench]]
|
|
name = "vec_deque_append_bench"
|
|
path = "benches/vec_deque_append.rs"
|
|
harness = false
|
|
|
|
[features]
|
|
compiler-builtins-mem = ['compiler_builtins/mem']
|
|
compiler-builtins-c = ["compiler_builtins/c"]
|
|
compiler-builtins-no-asm = ["compiler_builtins/no-asm"]
|
|
compiler-builtins-mangled-names = ["compiler_builtins/mangled-names"]
|
|
compiler-builtins-weak-intrinsics = ["compiler_builtins/weak-intrinsics"]
|
|
# Make panics and failed asserts immediately abort without formatting any message
|
|
panic_immediate_abort = ["core/panic_immediate_abort"]
|
|
# Choose algorithms that are optimized for binary size instead of runtime performance
|
|
optimize_for_size = ["core/optimize_for_size"]
|
|
|
|
[lints.rust.unexpected_cfgs]
|
|
level = "warn"
|
|
# x.py uses beta cargo, so `check-cfg` entries do not yet take effect
|
|
# for rust-lang/rust. But for users of `-Zbuild-std` it does.
|
|
check-cfg = [
|
|
'cfg(bootstrap)',
|
|
'cfg(no_global_oom_handling)',
|
|
'cfg(no_rc)',
|
|
'cfg(no_sync)',
|
|
]
|