strings: fill in safety comments for CappedString

This patch fills in some missing safety comments in the implementation
of `CappedString`, and adds some additional comments for clarity.
main
pantonshire 3 years ago
parent 0d88775366
commit 119a32840a

@ -271,7 +271,8 @@ impl<const N: usize> CappedString<N> {
}; };
// SAFETY: // SAFETY:
// // `src` is a valid string slice with length `len`. We have checked that
// `len <= N - self.len` holds above (note that `Self::MAX_LEN == N`).
unsafe { self.append_bytes(src.as_ptr(), len); } unsafe { self.append_bytes(src.as_ptr(), len); }
Ok(()) Ok(())
@ -289,16 +290,20 @@ impl<const N: usize> CappedString<N> {
{ {
let remaining_cap = Self::MAX_LEN - self.len; let remaining_cap = Self::MAX_LEN - self.len;
// Short-circuit if we have no space left to copy into.
if remaining_cap == 0 { if remaining_cap == 0 {
return; return;
} }
let src = <S as AsRef<str>>::as_ref(src); let src = <S as AsRef<str>>::as_ref(src);
// Find the longest valid UTF-8 prefix which fits into the remaining space.
let (src, len) = truncate_str(src, remaining_cap); let (src, len) = truncate_str(src, remaining_cap);
// SAFETY: // SAFETY:
// // `truncate_str` returns a pointer to `len` bytes of valid UTF-8 string data. The returned
// `len` will always be less than or equal to `remaining_cap`, which is equal to
// `N - self.len` (note that `Self::MAX_LEN == N`).
unsafe { self.append_bytes(src, len); } unsafe { self.append_bytes(src, len); }
} }
@ -545,7 +550,7 @@ impl<const N: usize> fmt::Display for CappedString<N> {
} }
/// Returns a pointer to the longest prefix of `src` which is valid UTF-8 and whose length is /// Returns a pointer to the longest prefix of `src` which is valid UTF-8 and whose length is
/// shorter than `max_len`, and returns the length of this prefix. /// less than or equal to `max_len`, and returns the length of this prefix.
#[inline] #[inline]
fn truncate_str(src: &str, max_len: u8) -> (*const u8, u8) { fn truncate_str(src: &str, max_len: u8) -> (*const u8, u8) {
match u8::try_from(src.len()) { match u8::try_from(src.len()) {
@ -587,18 +592,6 @@ fn truncate_str(src: &str, max_len: u8) -> (*const u8, u8) {
i -= 1; i -= 1;
} }
// // SAFETY:
// // As discussed above, `i < src.len()` always holds, so `..i` is a valid range over
// // `src`.
// let src_truncated = unsafe { src.get_unchecked(..usize::from(i)) };
// // SAFETY:
// // `i` is the index of a start of a codepoint, and codepoints are contiguous, so the
// // substring `src[..i]` must be valid UTF-8.
// let src_truncated = unsafe { str::from_utf8_unchecked(src_truncated) };
// (src_truncated, i)
// `i < src.len()` always holds as discussed above, so the pointer `src.as_ptr()` is // `i < src.len()` always holds as discussed above, so the pointer `src.as_ptr()` is
// valid for reads of `i` bytes. `i` is the index of the start of a codepoint, and // valid for reads of `i` bytes. `i` is the index of the start of a codepoint, and
// codepoints are contiguous, so the `i` bytes being pointed to must be valid UTF-8. // codepoints are contiguous, so the `i` bytes being pointed to must be valid UTF-8.

Loading…
Cancel
Save