| Bill Allombert on Thu, 2 Oct 2003 20:52:11 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| qfbprimeform(-3,1)--> stack corruption |
Hello PARI-Dev,
? qfbprimeform(-3,1)
%1 = Qfb(1, 1, 33554435)
This looks like a stack corruption do to an abuse of setsigne(y[3],1).
Unfortunately, there is no warranty that a PARI function return a value
on the stack rather than gzero or gun. If we can restrain ourself to use
such hack, we should write a macro that do it correctly.
Here a not very good patch:
--- src/basemath/arith2.c Thu Oct 2 19:31:13 2003
+++ ../src/pari/src/basemath/arith2.c Wed Sep 17 11:49:12 2003
@@ -1669,7 +1669,7 @@
GEN y = cgetg(4,t_QFI);
long isodd;
- if (typ(D) != t_INT || signe(D) >= 0) err(typeer,"imag_unit_form_by_disc");
+ if (typ(D) != t_INT || signe(D) >= 0) err(typeer,"real_unit_form_by_disc");
switch(4 - mod4(D))
{
case 2:
@@ -1678,7 +1678,7 @@
y[1] = un; isodd = mpodd(D);
y[2] = isodd? un: zero;
/* y[3] = (1-D) / 4 or -D / 4, whichever is an integer */
- y[3] = lshifti(D,-2); if(signe(y[3])==-1) setsigne(y[3],1);
+ y[3] = lshifti(D,-2); setsigne(y[3],1);
if (isodd)
{
pari_sp av = avma;
Cheers,
Bill.