Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Fri, 17 Jul 2015 17:28:58 -0400
From: Rich Felker <>
Subject: Re: Left-shift of negative number

On Fri, Jul 17, 2015 at 06:28:00PM +0000, Loïc Runarvot wrote:
> According to the C11 standard, doing a left-shift on a negative
> integer is considered as an undefined behavior (6.5.7:4).
> This undefined behavior occurs in files src/multibyte/internal.c and
> src/multibyte/internal.h. At line 21 in the header
> (,
> the implementation of the macro-definition R allow to have a
> negative value on the expression ((a == 0x80) ? 0x40-b : -a) << 23.
> In fact, in the source file, at the line 11
> (
> During the application of the macro-definition R(0x90, 0xc0), we
> have a != 0x90, so it's try to do (-0x90) << 23, which is an
> undefined behavior.

Thank you. Reporting of such issues is very welcome, as it is the
intent in musl to avoid undefined behavior regardless of whether it's
believed to cause problems with current compilers. The cleanest
solution is probably to use unsigned arithmetic here (e.g. replace -a
with 0u-a or -(unsigned)a) but I'd like to look at the code in more
detail again and check all of the consequences before committing to a
particular approach to fixing it.

> This bug was found in the context of the libc cross-testing project
> (a post blog has been written on this subject yesterday:

The link doesn't seem to be working for me. I'd like to hear more
about this project, so please let me know if there's somewhere else I
can find info or if there's a corrected link that works.


Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.