Skip to content

Commit

Permalink
Auto merge of #83609 - klensy:c-str, r=m-ou-se
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
bors committed Mar 29, 2021
2 parents 3aedcf0 + a0ff461 commit 7750402
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 2 deletions.
6 changes: 4 additions & 2 deletions library/std/src/ffi/c_str.rs
Original file line number Diff line number Diff line change
Expand Up @@ -613,7 +613,8 @@ impl CString {
#[inline]
#[stable(feature = "rust1", since = "1.0.0")]
pub fn as_bytes(&self) -> &[u8] {
&self.inner[..self.inner.len() - 1]
// SAFETY: CString has a length at least 1
unsafe { self.inner.get_unchecked(..self.inner.len() - 1) }
}

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

/// Converts this C string to a byte slice containing the trailing 0 byte.
Expand Down
16 changes: 16 additions & 0 deletions library/std/src/ffi/c_str/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -193,3 +193,19 @@ fn cstr_index_from_empty() {
let cstr = CStr::from_bytes_with_nul(original).unwrap();
let _ = &cstr[original.len()..];
}

#[test]
fn c_string_from_empty_string() {
let original = "";
let cstring = CString::new(original).unwrap();
assert_eq!(original.as_bytes(), cstring.as_bytes());
assert_eq!([b'\0'], cstring.as_bytes_with_nul());
}

#[test]
fn c_str_from_empty_string() {
let original = b"\0";
let cstr = CStr::from_bytes_with_nul(original).unwrap();
assert_eq!([] as [u8; 0], cstr.to_bytes());
assert_eq!([b'\0'], cstr.to_bytes_with_nul());
}

0 comments on commit 7750402

Please sign in to comment.