Skip to content

Commit b84f981

Browse files
Document unsafety in src/libcore/hash/sip.rs
1 parent d1ce7ff commit b84f981

File tree

1 file changed

+8
-3
lines changed

1 file changed

+8
-3
lines changed

src/libcore/hash/sip.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
//! An implementation of SipHash.
22
3-
// ignore-tidy-undocumented-unsafe
4-
53
#![allow(deprecated)] // the types in this module are deprecated
64

75
use crate::cmp;
@@ -265,6 +263,7 @@ impl<S: Sip> super::Hasher for Hasher<S> {
265263

266264
if self.ntail != 0 {
267265
needed = 8 - self.ntail;
266+
// SAFETY: `cmp::min(length, needed)` is guaranteed to not be over `length`
268267
self.tail |= unsafe { u8to64_le(msg, 0, cmp::min(length, needed)) } << (8 * self.ntail);
269268
if length < needed {
270269
self.ntail += length;
@@ -279,10 +278,13 @@ impl<S: Sip> super::Hasher for Hasher<S> {
279278

280279
// Buffered tail is now flushed, process new input.
281280
let len = length - needed;
282-
let left = len & 0x7;
281+
let left = len & 0x7; // len % 8
283282

284283
let mut i = needed;
285284
while i < len - left {
285+
// SAFETY: because `len - left` is the biggest multiple of 8 under
286+
// `len`, and because `i` starts at `needed` where `len` is `length - needed`,
287+
// `i + 8` is guaranteed to be less than or equal to `length`.
286288
let mi = unsafe { load_int_le!(msg, i, u64) };
287289

288290
self.state.v3 ^= mi;
@@ -292,6 +294,9 @@ impl<S: Sip> super::Hasher for Hasher<S> {
292294
i += 8;
293295
}
294296

297+
// SAFETY: `i` is now `needed + len.div_euclid(8) * 8`,
298+
// so `i + left` = `needed + len` = `length`, which is by
299+
// definition equal to `msg.len()`.
295300
self.tail = unsafe { u8to64_le(msg, i, left) };
296301
self.ntail = left;
297302
}

0 commit comments

Comments
 (0)