On Mon, Feb 6, 2017 at 8:52 AM, Rob Landley <[email protected]> wrote:
>
> On 02/01/2017 12:35 PM, Rostislav Skudnov wrote:
>> An example of such an error (should be compiled with DEBUG_SANITIZE):
>>
>> runtime error: left shift of 1 by 31 places cannot be represented in
>> type 'int'
>
> Sure it can. We know exactly what bit pattern that represents in two's
> complement, which has been the ubiquitous representation of negative
> numbers since 1964.
>
> Is this another "may be used uninitialized" thing where the compiler's
> complaining about something that can't happen? Or have the C++ deveopers
> who took over implementation of the C compiler broken yet another thing
> that's universally worked since the 1960s because they want to extend
> "undefined behavior" until C is as much of a minefield of special case
> memorization as C++ is?
>
>> Signed-off-by: Rostislav Skudnov <[email protected]>
>> ---
>>  archival/libarchive/decompress_bunzip2.c | 6 +++---
>>  libbb/crc32.c                            | 2 +-
>>  libbb/getopt32.c                         | 4 ++--
>>  libbb/pw_encrypt.c                       | 2 +-
>>  miscutils/rx.c                           | 2 +-
>>  5 files changed, 8 insertions(+), 8 deletions(-)
>>
>> diff --git a/archival/libarchive/decompress_bunzip2.c 
>> b/archival/libarchive/decompress_bunzip2.c
>> index fe5953d..4fb989c 100644
>> --- a/archival/libarchive/decompress_bunzip2.c
>> +++ b/archival/libarchive/decompress_bunzip2.c
>> @@ -134,7 +134,7 @@ static unsigned get_bits(bunzip_data *bd, int 
>> bits_wanted)
>>
>>               /* Avoid 32-bit overflow (dump bit buffer to top of output) */
>>               if (bit_count >= 24) {
>> -                     bits = bd->inbufBits & ((1 << bit_count) - 1);
>> +                     bits = bd->inbufBits & ((1U << bit_count) - 1);
>
> What's an archive input that actually fails? What's an example of a
> processor machine language that doesn't produce 0x80000000 for 1<<31?
>
> Where does this actually cause a problem?
>

I think at least this silences a "undefined behavior" warning, and that's
enough for the patch. Sure, many CPU architectures out there use two's
complement, but that's not mandated in the C standard.
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to