>> In C, the result of an overflowing add of two signed integers is
>> undefined.

Strewth! That's a surprise to me. I always thought that C defined integer arithmetic to always wrap. Checking for a negative to detect overflow is a common pattern - heck it's THE pattern for detecting overflow according to "Hacker's Delight"! But it isn't valid C ! ???

Even in Java this pattern is used a lot - I guess it's lucky the VM goes straight to machine code not C otherwise we'd be in trouble!

David Holmes

Martin Buchholz said the following on 12/24/08 06:42:
Hi Gary,

Does this actually change the behavior with recent gccs?

It seems like the introduction of uint32_t is trading one
non-portability for another, namely relying on C99 features.
I have been waiting patiently for C99 compilers to emerge,
but gcc for example is still not there yet.
http://gcc.gnu.org/c99status.html

If you are going to use types like uint32_t, you should
be including the standard header that defines them - <stdint.h>

More immediate and obvious improvements to the code would
be to change the type of datalen to "jsize" and the type of nread
to "jint".

I suggest, instead of using unsigned types, is to do what
java code would do in a case like this, and cast to jlong
instead of uint32_t to avoid overflow.  I approve this patch
if you make that change.

I see you've eliminated one of the checks, which was unnecessary.
Thanks for that.

Martin

On Tue, Dec 23, 2008 at 02:21, Gary Benson <gben...@redhat.com> wrote:
Hi all,

In C, the result of an overflowing add of two signed integers is
undefined.  The array bounds checks in readBytes and writeBytes
in jdk/src/share/native/java/io/io_util.c, however, rely on the
assumption that the result of the overflowing add will be negative.
The attached patch fixes.

Cheers,
Gary

--
http://gbenson.net/

Reply via email to