From: Mark Wielaard Date: Tue, 22 Apr 2014 14:43:11 +0000 (+0200) Subject: libdw (get_sleb128_step): Remove undefined behavior. X-Git-Tag: elfutils-0.159~17 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=eb4da48fa48c69e303b410c4bf7dd7bea8108406;p=thirdparty%2Felfutils.git libdw (get_sleb128_step): Remove undefined behavior. As pointed out by gcc -fsanitize=undefined left shifting a negative value is undefined. Replace it with a multiplication of the signed value as suggested by Richard Henderson and Josh Stone. Signed-off-by: Mark Wielaard --- diff --git a/libdw/ChangeLog b/libdw/ChangeLog index 49d70af4e..a7b040001 100644 --- a/libdw/ChangeLog +++ b/libdw/ChangeLog @@ -1,3 +1,8 @@ +2014-04-22 Mark Wielaard + + * memory-access.h (get_sleb128_step): Remove undefined behavior + of left shifting a signed value. Replace it with a multiplication. + 2014-04-13 Mark Wielaard * Makefile.am: Remove !MUDFLAP conditions. diff --git a/libdw/memory-access.h b/libdw/memory-access.h index d0ee63c53..f41f783dd 100644 --- a/libdw/memory-access.h +++ b/libdw/memory-access.h @@ -1,5 +1,5 @@ /* Unaligned memory access functionality. - Copyright (C) 2000-2013 Red Hat, Inc. + Copyright (C) 2000-2014 Red Hat, Inc. This file is part of elfutils. Written by Ulrich Drepper , 2001. @@ -71,7 +71,7 @@ __libdw_get_uleb128 (const unsigned char **addrp) if (likely ((__b & 0x80) == 0)) \ { \ struct { signed int i:7; } __s = { .i = __b }; \ - (var) |= (typeof (var)) __s.i << ((nth) * 7); \ + (var) |= (typeof (var)) __s.i * ((typeof (var)) 1 << ((nth) * 7)); \ return (var); \ } \ (var) |= (typeof (var)) (__b & 0x7f) << ((nth) * 7); \