| Gerhard Niklasch on Wed, 5 Aug 1998 15:59:24 +0200 (MET DST) |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Fix for sign extension buglet |
And another small patch for 2.0.11.beta. Guillaume Hanrot (thanks!)
noted that under some conditions, notably on DEC alphas, one line
in the cgcd() function in arith1.c would produce a (signed) C int, of
half the size of a signed long, with the most significant bit turned on,
which would then get converted to a (negative) C long by sign extension,
although a positive value was intended. The fix is to tell the compiler
that the thing is a C long right from the start. Two more potential
problems of this kind are secured below; if anybody can find any other
similar places in the code, please do let us know.
Enjoy, Gerhard
Apply with patch -p0 -l from the pari-2.0.11.beta directory (-l because
TABs/spaces otherwise might not match).
bash$ diff -u src/basemath/arith1.c.orig src/basemath/arith1.c
--- src/basemath/arith1.c.orig Tue Aug 4 20:02:23 1998
+++ src/basemath/arith1.c Tue Aug 4 20:02:25 1998
@@ -921,7 +921,7 @@
if (a>b) { a %= b; if (!a) return b; }
else { b %= a; if (!b) return a; }
v=vals(a|b); a>>=v; b>>=v;
- if (a==1 || b==1) return 1<<v;
+ if (a==1 || b==1) return 1L<<v;
if (b&1)
return ((long)ugcd((ulong)a, (ulong)b)) << v;
else
bash$ diff -u src/basemath/arith2.c.orig src/basemath/arith2.c
--- src/basemath/arith2.c.orig Tue Aug 4 21:30:38 1998
+++ src/basemath/arith2.c Tue Aug 4 21:30:42 1998
@@ -316,7 +316,7 @@
return 16384;
else if (size <= 512)
return (size-16) << 10;
- return 1<<19; /* Rho will generally be faster above this */
+ return 1L<<19; /* Rho will generally be faster above this */
}
/********** about to become obsolete --GN **********/
bash$ diff -u src/basemath/ifactor1.c.orig src/basemath/ifactor1.c
--- src/basemath/ifactor1.c.orig Tue Aug 4 21:31:57 1998
+++ src/basemath/ifactor1.c Tue Aug 4 21:31:59 1998
@@ -620,7 +620,7 @@
else if (size < 65500)
c0 = size<<6; /* back to linear; ECM taking over */
else
- c0 = 1<<22;
+ c0 = 1L<<22;
/* improbable, but size _could_ be
very large indeed... */
c = c0 << 4; /* 16 iterations per round */