From mboxrd@z Thu Jan 1 00:00:00 1970 From: erik quanstrom Date: Tue, 1 Dec 2009 13:41:32 -0500 To: 9fans@9fans.net Message-ID: In-Reply-To: <> References: <> MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit Subject: Re: [9fans] compiler double bug. Topicbox-Message-UUID: a63debc0-ead5-11e9-9d60-3106f5b1d025 On Tue Dec 1 11:58:47 EST 2009, forsyth@terzarima.net wrote: > i hadn't noticed the changed example. > it's removing the cast, which probably isn't right, although > in that particular case it's probably better > that it should trap (because the result is wrong). > what is the actual code in awk that's equivalent to that sequence? > all these fault: minooka; awk 'BEGIN { s = "01234567890"; printf "%x\n", 4215866817. g = 1. # delayed fpe printf "%08x", 4215866817. print substr(s, 4215866817., 1) s = substr(s, 1, 4215866817.) g= 1. # delayed fpe printf utf(4215866817.); g= 1. # delayed fpe }' a (not-so-elegant) fix follows. - erik proto.h:92,98 - /n/dump/2009/1129/sys/src/cmd/awk/proto.h:92,97 extern void funnyvar(Cell *, const char *); extern char *setsval(Cell *, const char *); extern double getfval(Cell *); - extern unsigned long getival(Cell *, unsigned long, unsigned long); extern char *getsval(Cell *); extern char *getpssval(Cell *); /* for print */ extern char *tostring(const char *); diff: can't stat /n/dump/2009/1129/sys/src/cmd/awk/trans.c run.c:50,57 - /n/dump/2009/1129/sys/src/cmd/awk/run.c:50,55 } */ - #define Imax ULONG_MAX - /* do we really need these? */ /* #ifdef _NFILE */ /* #ifndef FOPEN_MAX */ run.c:355,361 - /n/dump/2009/1129/sys/src/cmd/awk/run.c:353,359 case EXIT: if (a[0] != NULL) { y = execute(a[0]); - errorflag = getfval(y) != 0.; + errorflag = (int) getfval(y); tempfree(y); } longjmp(env, 1); run.c:752,765 - /n/dump/2009/1129/sys/src/cmd/awk/run.c:750,770 setsval(x, ""); return(x); } - m = getival(y, 1, k); /* 1 <= m <= k */ + m = (int) getfval(y); + if (m <= 0) + m = 1; + else if (m > k) + m = k; tempfree(y); if (a[2] != 0) { - n = getival(z, 0, k-m); - /* n <= 0 <= k-m */ + n = (int) getfval(z); tempfree(z); } else n = k - 1; + if (n < 0) + n = 0; + else if (n > k - m) + n = k - m; dprintf( ("substr: m=%d, n=%d, s=%s\n", m, n, s) ); y = gettemp(); temp = s[n+m-1]; /* with thanks to John Linderman */ run.c:804,810 - /n/dump/2009/1129/sys/src/cmd/awk/run.c:809,815 char *p, *t; const char *os; Cell *x; - int flag = 0, n, ch; + int flag = 0, n; int fmtwd; /* format width */ int fmtsz = recsize; char *buf = *pbuf; run.c:838,844 - /n/dump/2009/1129/sys/src/cmd/awk/run.c:843,849 if (*s == '*') { x = execute(a); a = a->nnext; - sprintf(t-1, "%d", fmtwd=getival(x, Imax, Imax)); + sprintf(t-1, "%d", fmtwd=(int) getfval(x)); if (fmtwd < 0) fmtwd = -fmtwd; adjbuf(&buf, &bufsize, fmtwd+1+p-buf, recsize, &p, "format"); run.c:894,901 - /n/dump/2009/1129/sys/src/cmd/awk/run.c:900,907 sprintf(p, "%s", t); break; case 'f': sprintf(p, fmt, getfval(x)); break; - case 'd': sprintf(p, fmt, getival(x, Imax, Imax)); break; - case 'u': sprintf(p, fmt, getival(x, Imax, Imax)); break; + case 'd': sprintf(p, fmt, (long) getfval(x)); break; + case 'u': sprintf(p, fmt, (int) getfval(x)); break; case 's': t = getsval(x); n = strlen(t); run.c:907,915 - /n/dump/2009/1129/sys/src/cmd/awk/run.c:913,920 break; case 'c': if (isnum(x)) { - ch = getival(x, Imax, Imax); - if (ch) - sprintf(p, fmt, ch); + if (getfval(x)) + sprintf(p, fmt, (int) getfval(x)); else { *p++ = '\0'; /* explicit null byte */ *p = '\0'; /* next output will start here */ Awkfloat strtonum(Cell *x) { run.c:1566,1579 - /n/dump/2009/1129/sys/src/cmd/awk/run.c:1583,1589 u = fflush(fp); break; case FUTF: - r = getival(x, Imax, Imax); - if(r < 0) - r = -r; - if(r > Runemax){ - WARNING("utf argument out-of-range %g", getfval(x)); - r = Runeerror; - } - wc = r; + wc = (int)getfval(x); mbc[wctomb(mbc, wc)] = 0; tempfree(x); x = gettemp();