Date: Tue, 1 Jan 2019 10:32:26 -0800 From: Steve Kargl <sgk@troutmask.apl.washington.edu> To: Pedro Giffuni <pfg@freebsd.org> Cc: freebsd-numerics@freebsd.org Subject: Re: Undefined Behavior in lib/msun/src/e_pow.c (was Re: New math library from ARM) Message-ID: <20190101183226.GA11443@troutmask.apl.washington.edu> In-Reply-To: <9cdce84b-2cff-d752-67a9-4c9ef391cc2c@FreeBSD.org> References: <797a7755-db93-1b9c-f3b9-8850d948e098@FreeBSD.org> <20181231151904.GB823@troutmask.apl.washington.edu> <20181231152230.GC823@troutmask.apl.washington.edu> <06c8b6a2-ed26-f255-3947-c79b593a9dea@FreeBSD.org> <20190101045425.GA5767@troutmask.apl.washington.edu> <d01c8770-5431-0634-4ecc-37069ff76458@FreeBSD.org> <20190101055225.GA5982@troutmask.apl.washington.edu> <e6bd09b3-35c6-922b-1b4d-de27e424a627@FreeBSD.org> <9cdce84b-2cff-d752-67a9-4c9ef391cc2c@FreeBSD.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, Jan 01, 2019 at 10:01:45AM -0500, Pedro Giffuni wrote:
>
> >> This would be easy
> >> to see if all declarations are grouped together. In additional,
> >> don't you need to include stdint.h to get uint32_t?
> >
> > Well, my patch did compile, but I will match the existing style if
> > the change is accepted/desired.
Yeah, I found that out myself. I cannot find where stdint.h is
being pulled into the build. It seems that one of the included
headers may have some namespace pollution.
> >> % grep uint32_t /usr/src/lib/msun/src/e_pow.c
> >> % grep u_int32_t /usr/src/lib/msun/src/e_pow.c
> >> u_int32_t lx,ly;
> >> n = ((u_int32_t)hx>>31)-1;
> >>
> >> Code churn to placate lint for an event that cannot occur
> >> seems dubious to me.
> >>
> > UBsan should be able to detect it. I think Undefined Behavior is
> > considered a portability bug.
> >
> > There is no urgency but it is still a bug.
> >
> In the new patch: the first j comparison has to be made against an
> unsigned value anyways and the second comparison will never be against
> the magical 31 so there is no need to cast that one.
>
I'll defer to Bruce on which patch he prefers. If bde doesn't
weigh in, then choose which ever you want. Me, I would do
Index: src/e_pow.c
===================================================================
--- src/e_pow.c (revision 2135)
+++ src/e_pow.c (working copy)
@@ -104,7 +104,7 @@ __ieee754_pow(double x, double y)
double y1,t1,t2,r,s,t,u,v,w;
int32_t i,j,k,yisint,n;
int32_t hx,hy,ix,iy;
- u_int32_t lx,ly;
+ u_int32_t jj,lx,ly;
EXTRACT_WORDS(hx,lx,x);
EXTRACT_WORDS(hy,ly,y);
@@ -132,8 +132,8 @@ __ieee754_pow(double x, double y)
else if(iy>=0x3ff00000) {
k = (iy>>20)-0x3ff; /* exponent */
if(k>20) {
- j = ly>>(52-k);
- if((j<<(52-k))==ly) yisint = 2-(j&1);
+ jj = ly>>(52-k);
+ if((jj<<(52-k))==ly) yisint = 2-(j&1);
} else if(ly==0) {
j = iy>>(20-k);
if((j<<(20-k))==iy) yisint = 2-(j&1);
--
Steve
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20190101183226.GA11443>
