From ba9a8d9c235842c99724ebbc81327a2c4e0f2b62 Mon Sep 17 00:00:00 2001 From: DrAsu33 <3537555264@qq.com> Date: Mon, 24 Nov 2025 23:00:55 +0800 Subject: [PATCH 1/8] Fix dropping elements for zero-sized types in IntoIter Handle zero-sized types (ZST) to prevent unalignment issues when dropping elements. --- library/alloc/src/vec/into_iter.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/library/alloc/src/vec/into_iter.rs b/library/alloc/src/vec/into_iter.rs index 358bdeacae790..24b0c32c40102 100644 --- a/library/alloc/src/vec/into_iter.rs +++ b/library/alloc/src/vec/into_iter.rs @@ -411,7 +411,12 @@ impl DoubleEndedIterator for IntoIter { // SAFETY: same as for advance_by() self.end = unsafe { self.end.sub(step_size) }; } - let to_drop = ptr::slice_from_raw_parts_mut(self.end as *mut T, step_size); + let to_drop = if T::IS_ZST { + //ZST may cause unalignment + ptr::slice_from_raw_parts_mut(ptr::NonNull::::dangling().as_ptr(), step_size()) + } else { + ptr::slice_from_raw_parts_mut(self.end as *mut T, step_size) + }; // SAFETY: same as for advance_by() unsafe { ptr::drop_in_place(to_drop); @@ -419,7 +424,6 @@ impl DoubleEndedIterator for IntoIter { NonZero::new(n - step_size).map_or(Ok(()), Err) } } - #[stable(feature = "rust1", since = "1.0.0")] impl ExactSizeIterator for IntoIter { fn is_empty(&self) -> bool { From 32ddf5e84cecfbdd0c365a53f77b923b91494287 Mon Sep 17 00:00:00 2001 From: DrAsu33 <3537555264@qq.com> Date: Mon, 24 Nov 2025 23:04:28 +0800 Subject: [PATCH 2/8] Add test for nth_back with high alignment ZST Test that Intolter::nth_back does not cause UB for ZSTs with high alignment. --- tests/ui/issues/issue-148682.rs | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 tests/ui/issues/issue-148682.rs diff --git a/tests/ui/issues/issue-148682.rs b/tests/ui/issues/issue-148682.rs new file mode 100644 index 0000000000000..6100ed3733ffa --- /dev/null +++ b/tests/ui/issues/issue-148682.rs @@ -0,0 +1,8 @@ +//test Intolter::nth_back does not cause UB for ZSTs with high alignment +#[repr(align(8))] +struct Thing; + +fn main() { + let v = vec![Thing, Thing]; + let _ = v.into_iter().nth_back(1); +} From 4e344577d481ef6820f8f92d22ed9a85d56fab5d Mon Sep 17 00:00:00 2001 From: DrAsu33 <3537555264@qq.com> Date: Mon, 24 Nov 2025 23:30:57 +0800 Subject: [PATCH 3/8] Correct pointer creation for zero-sized types Fix incorrect usage of step_size in pointer creation for ZST. --- library/alloc/src/vec/into_iter.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/alloc/src/vec/into_iter.rs b/library/alloc/src/vec/into_iter.rs index 24b0c32c40102..af68938399889 100644 --- a/library/alloc/src/vec/into_iter.rs +++ b/library/alloc/src/vec/into_iter.rs @@ -413,7 +413,7 @@ impl DoubleEndedIterator for IntoIter { } let to_drop = if T::IS_ZST { //ZST may cause unalignment - ptr::slice_from_raw_parts_mut(ptr::NonNull::::dangling().as_ptr(), step_size()) + ptr::slice_from_raw_parts_mut(ptr::NonNull::::dangling().as_ptr(), step_size) } else { ptr::slice_from_raw_parts_mut(self.end as *mut T, step_size) }; From 59b9c7fc3ce0637e60f1217b6479f63631be2182 Mon Sep 17 00:00:00 2001 From: DrAsu33 <3537555264@qq.com> Date: Tue, 25 Nov 2025 00:19:18 +0800 Subject: [PATCH 4/8] Update issue-148682.rs --- tests/ui/issues/issue-148682.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/ui/issues/issue-148682.rs b/tests/ui/issues/issue-148682.rs index 6100ed3733ffa..257418c7ae37b 100644 --- a/tests/ui/issues/issue-148682.rs +++ b/tests/ui/issues/issue-148682.rs @@ -1,3 +1,4 @@ +// check-pass //test Intolter::nth_back does not cause UB for ZSTs with high alignment #[repr(align(8))] struct Thing; From 96102b7b41fb28dd90207ec58459b6675475a47d Mon Sep 17 00:00:00 2001 From: DrAsu33 <3537555264@qq.com> Date: Tue, 25 Nov 2025 09:29:40 +0800 Subject: [PATCH 5/8] Add test for issue ZST nthback 148682 --- .../ui/issues/{issue-148682.rs => issue-zst-nthback-148682.rs} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename tests/ui/issues/{issue-148682.rs => issue-zst-nthback-148682.rs} (92%) diff --git a/tests/ui/issues/issue-148682.rs b/tests/ui/issues/issue-zst-nthback-148682.rs similarity index 92% rename from tests/ui/issues/issue-148682.rs rename to tests/ui/issues/issue-zst-nthback-148682.rs index 257418c7ae37b..123fe27fd5bde 100644 --- a/tests/ui/issues/issue-148682.rs +++ b/tests/ui/issues/issue-zst-nthback-148682.rs @@ -1,4 +1,4 @@ -// check-pass +// @ check-pass //test Intolter::nth_back does not cause UB for ZSTs with high alignment #[repr(align(8))] struct Thing; From c1805f56a51bf384561a1233bfb7c2196a7eba55 Mon Sep 17 00:00:00 2001 From: DrAsu33 <3537555264@qq.com> Date: Tue, 25 Nov 2025 10:25:27 +0800 Subject: [PATCH 6/8] Change test directive from check-pass to run-pass Update test to check for run-pass instead of check-pass. --- tests/ui/issues/issue-zst-nthback-148682.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/ui/issues/issue-zst-nthback-148682.rs b/tests/ui/issues/issue-zst-nthback-148682.rs index 123fe27fd5bde..2a718400bb06f 100644 --- a/tests/ui/issues/issue-zst-nthback-148682.rs +++ b/tests/ui/issues/issue-zst-nthback-148682.rs @@ -1,5 +1,4 @@ -// @ check-pass -//test Intolter::nth_back does not cause UB for ZSTs with high alignment +//@ run-pass #[repr(align(8))] struct Thing; From a1a1866e715bc80926999f48e8b50591d1adb635 Mon Sep 17 00:00:00 2001 From: DrAsu33 <3537555264@qq.com> Date: Tue, 25 Nov 2025 10:37:54 +0800 Subject: [PATCH 7/8] Create ZST-nthback.rs test for nth_back method Add test for Intolter::nth_back with ZSTs --- tests/ui/iterators/ZST-nthback.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 tests/ui/iterators/ZST-nthback.rs diff --git a/tests/ui/iterators/ZST-nthback.rs b/tests/ui/iterators/ZST-nthback.rs new file mode 100644 index 0000000000000..14ee98857b442 --- /dev/null +++ b/tests/ui/iterators/ZST-nthback.rs @@ -0,0 +1,10 @@ +//@ check-pass +// test Intolter::nth_back does not cause UB for ZSTs with high alignment + +#[repr(align(8))] +struct Thing; + +fn main() { + let v = vec![Thing, Thing]; + let _ = v.into_iter().nth_back(1); +} From fc2decd05462f1bbafb857a02cd8d505c7cd8ca2 Mon Sep 17 00:00:00 2001 From: DrAsu33 <3537555264@qq.com> Date: Tue, 25 Nov 2025 10:38:26 +0800 Subject: [PATCH 8/8] Delete tests/ui/issues/issue-zst-nthback-148682.rs --- tests/ui/issues/issue-zst-nthback-148682.rs | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 tests/ui/issues/issue-zst-nthback-148682.rs diff --git a/tests/ui/issues/issue-zst-nthback-148682.rs b/tests/ui/issues/issue-zst-nthback-148682.rs deleted file mode 100644 index 2a718400bb06f..0000000000000 --- a/tests/ui/issues/issue-zst-nthback-148682.rs +++ /dev/null @@ -1,8 +0,0 @@ -//@ run-pass -#[repr(align(8))] -struct Thing; - -fn main() { - let v = vec![Thing, Thing]; - let _ = v.into_iter().nth_back(1); -}