Messages in this thread | | | Date | Mon, 17 Dec 2007 18:23:12 +0000 | From | Al Viro <> | Subject | Re: Signed divides vs shifts (Re: [Security] /dev/urandom uses uninit bytes, leaks user data) |
| |
On Mon, Dec 17, 2007 at 06:55:57PM +0100, Eric Dumazet wrote:
> long *mid(long *a, long *b) > { > return ((a - b) / 2 + a); > }
... is not actually a middle (you'd want b-a, not a-b there), but anyway
> It gave : > mid: > movq %rdi, %rdx > subq %rsi, %rdx > sarq $3, %rdx > movq %rdx, %rax > shrq $63, %rax > addq %rdx, %rax > sarq %rax > leaq (%rdi,%rax,8), %rax > ret > > while > > long *mid(long *a, long *b) > { > return ((a - b) / 2u + a); > }
... undefined behaviour if a < b
> and while : > > long *mid(long *a, long *b) > { > return (((unsigned long)(a - b)) / 2 + a); > }
undefined behaviour, again.
| |