Skip to content

Commit 1b103f1

Browse files
committed
std: add safety comments to CStringArray
1 parent 3f835e3 commit 1b103f1

File tree

1 file changed

+13
-0
lines changed

1 file changed

+13
-0
lines changed

library/std/src/sys/process/unix/common/cstring_array.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ impl CStringArray {
2525
let argc = self.ptrs.len() - 1;
2626
let ptr = &mut self.ptrs[..argc][index];
2727
let old = mem::replace(ptr, item.into_raw());
28+
// SAFETY:
29+
// `CStringArray` owns all of its strings, and they were all transformed
30+
// into pointers using `CString::into_raw`. Also, this is not the null
31+
// pointer since the indexing above would have failed.
2832
drop(unsafe { CString::from_raw(old.cast_mut()) });
2933
}
3034

@@ -52,6 +56,9 @@ impl Index<usize> for CStringArray {
5256
type Output = CStr;
5357
fn index(&self, index: usize) -> &CStr {
5458
let ptr = self.ptrs[..self.ptrs.len() - 1][index];
59+
// SAFETY:
60+
// `CStringArray` owns all of its strings. Also, this is not the null
61+
// pointer since the indexing above would have failed.
5562
unsafe { CStr::from_ptr(ptr) }
5663
}
5764
}
@@ -69,6 +76,9 @@ unsafe impl Sync for CStringArray {}
6976

7077
impl Drop for CStringArray {
7178
fn drop(&mut self) {
79+
// SAFETY:
80+
// `CStringArray` owns all of its strings, and they were all transformed
81+
// into pointers using `CString::into_raw`.
7282
self.ptrs[..self.ptrs.len() - 1]
7383
.iter()
7484
.for_each(|&p| drop(unsafe { CString::from_raw(p.cast_mut()) }))
@@ -84,6 +94,9 @@ pub struct CStringIter<'a> {
8494
impl<'a> Iterator for CStringIter<'a> {
8595
type Item = &'a CStr;
8696
fn next(&mut self) -> Option<&'a CStr> {
97+
// SAFETY:
98+
// `CStringArray` owns all of its strings. Also, this is not the null
99+
// pointer since the last element is excluded when creating `iter`.
87100
self.iter.next().map(|&p| unsafe { CStr::from_ptr(p) })
88101
}
89102

0 commit comments

Comments
 (0)