lkml.org 
[lkml]   [2007]   [Dec]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: 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.


    \
     
     \ /
      Last update: 2007-12-17 19:27    [W:0.020 / U:89.096 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site