]> git.lizzy.rs Git - rust.git/commitdiff
Auto merge of #35969 - bluss:memrchr-alignment, r=nagisa
authorbors <bors@rust-lang.org>
Sat, 27 Aug 2016 14:52:20 +0000 (07:52 -0700)
committerGitHub <noreply@github.com>
Sat, 27 Aug 2016 14:52:20 +0000 (07:52 -0700)
memrchr: Correct aligned offset computation

The memrchr fallback did not compute the offset correctly. It was
intentioned to land on usize-aligned addresses but did not.
This was suspected to have resulted in a crash on ARMv7!

This bug affected non-linux platforms.

I think like this, if we have a slice with pointer `ptr` and length
`len`, we want to find the last usize-aligned offset in the slice.
The correct computation should be:

For example if ptr = 1 and len = 6, and `size_of::<usize>()` is 4:

```
[ x x x x x x ]
  1 2 3 4 5 6
        ^-- last aligned address at offset 3 from the start.
```

The last aligned address is ptr + len - (ptr + len) % usize_size.

Compute offset from the start as:

offset = len - (ptr + len) % usize_size = 6 - (1 + 6) % 4 = 6 - 3 = 3.

I believe the function's return value was always correct previously, if
the platform supported unaligned addresses.

Fixes #35967


Trivial merge