Skip to content

Commit 7750402

Browse files
committed
Auto merge of #83609 - klensy:c-str, r=m-ou-se
ffi::c_str removed bound checks on as_bytes, to_bytes This removes bound checks on CString::as_bytes() and CStr::to_bytes() and adds test.
2 parents 3aedcf0 + a0ff461 commit 7750402

File tree

2 files changed

+20
-2
lines changed

2 files changed

+20
-2
lines changed

library/std/src/ffi/c_str.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -613,7 +613,8 @@ impl CString {
613613
#[inline]
614614
#[stable(feature = "rust1", since = "1.0.0")]
615615
pub fn as_bytes(&self) -> &[u8] {
616-
&self.inner[..self.inner.len() - 1]
616+
// SAFETY: CString has a length at least 1
617+
unsafe { self.inner.get_unchecked(..self.inner.len() - 1) }
617618
}
618619

619620
/// Equivalent to [`CString::as_bytes()`] except that the
@@ -1322,7 +1323,8 @@ impl CStr {
13221323
#[stable(feature = "rust1", since = "1.0.0")]
13231324
pub fn to_bytes(&self) -> &[u8] {
13241325
let bytes = self.to_bytes_with_nul();
1325-
&bytes[..bytes.len() - 1]
1326+
// SAFETY: to_bytes_with_nul returns slice with length at least 1
1327+
unsafe { bytes.get_unchecked(..bytes.len() - 1) }
13261328
}
13271329

13281330
/// Converts this C string to a byte slice containing the trailing 0 byte.

library/std/src/ffi/c_str/tests.rs

+16
Original file line numberDiff line numberDiff line change
@@ -193,3 +193,19 @@ fn cstr_index_from_empty() {
193193
let cstr = CStr::from_bytes_with_nul(original).unwrap();
194194
let _ = &cstr[original.len()..];
195195
}
196+
197+
#[test]
198+
fn c_string_from_empty_string() {
199+
let original = "";
200+
let cstring = CString::new(original).unwrap();
201+
assert_eq!(original.as_bytes(), cstring.as_bytes());
202+
assert_eq!([b'\0'], cstring.as_bytes_with_nul());
203+
}
204+
205+
#[test]
206+
fn c_str_from_empty_string() {
207+
let original = b"\0";
208+
let cstr = CStr::from_bytes_with_nul(original).unwrap();
209+
assert_eq!([] as [u8; 0], cstr.to_bytes());
210+
assert_eq!([b'\0'], cstr.to_bytes_with_nul());
211+
}

0 commit comments

Comments
 (0)