Subject: Re: lib/35401
To: None <netbsd-bugs@netbsd.org>
From: Christos Zoulas <christos@astron.com>
List: netbsd-bugs
Date: 01/11/2007 18:39:31
In article <20070111180941.GA22758@cyclonus>,
Christian Biere  <christianbiere@gmx.de> wrote:
>Christos Zoulas wrote:
>> In article <20070111085655.GA16866@cyclonus>,
>> Christian Biere  <christianbiere@gmx.de> wrote:
>> >Christos Zoulas wrote:
>> >> Index: vfprintf.c
>> >> ===================================================================
>> >> RCS file: /cvsroot/src/lib/libc/stdio/vfprintf.c,v
>> >> retrieving revision 1.54
>> >> diff -u -u -r1.54 vfprintf.c
>> >> --- vfprintf.c	30 Oct 2006 05:10:40 -0000	1.54
>> >> +++ vfprintf.c	11 Jan 2007 02:56:58 -0000
>> >> @@ -353,6 +353,8 @@
>> >>  		if ((m = fmt - cp) != 0) {
>> >>  			PRINT(cp, m);
>> >>  			ret += m;
>> >> +			if (ret < 0)
>> >> +				goto ovfl;
>> >>  		}
>> >
>> >For what it's worth, this has undefined behaviour even though it
>probably just
>> >works with the current GCC.
> 
>> Can you please explain which part is undefined behavior?
>
>ret has type "int". Your fix assumes that an overflow causes a negative result.
>C says an integer overflow has undefined behaviour. I guess it works in practice
>but hardware with saturation arithmetic exists (MMX, SSE) and it might be the
>default operation in future architectures.

I seriously doubt it that we'll see saturation arithmetic in the C integral
types, but your point is valid.

christos