| Karim BELABAS on Wed, 9 Sep 1998 15:56:31 +0200 (MET DST) |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: a very cute bug |
[Igor Schein <igor@txc.com> writes: ]
> Hi, I discovered the following bug ( a,b and c are undefined):
> ? printp(1/a+1/b+1/c)
> *** segmentation fault: bug in GP (please report).
>
> At this point, gp has gone mad and gives segfault on
> any output, so one must exit.
GENtostring was not meant to be reentrant. It is now, since "prettyprint"
needs it (and it doesn't hurt in any case...).
Note: prettyprint format is _very_ buggy/ugly and badly needs to be
rewritten. For instance, after correcting the SEGV, one got:
(15:25) gp > printp(1/a+1/b+1/c)
(
(
1
-----
(c)
b + 1)
----------------------------
(b)
a + 1)
--------------------------------------------------------------------------------
(a)
I added a patch for that also so that it now appears as:
(15:43) gp > printp(1/a+1/b+1/c)
((((1 / (c)) b + 1) / (b)) a + 1)
-----------------------------------
(a)
which is definitely not OK, but a bit more acceptable.
Karim.
*** src/language/es.c.orig Wed Sep 9 15:20:08 1998
--- src/language/es.c Wed Sep 9 15:42:47 1998
***************
*** 12,18 ****
static void texi(GEN g, long nosign);
static void sori(GEN g);
static char format;
! static long decimals, chmp;
/* output a space or do nothing depending on original caller */
static void (*sp)();
--- 12,18 ----
static void texi(GEN g, long nosign);
static void sori(GEN g);
static char format;
! static long decimals, chmp, initial;
/* output a space or do nothing depending on original caller */
static void (*sp)();
***************
*** 438,452 ****
char *string;
ulong len,size;
} outString;
! static outString OutStr;
#define STEPSIZE 1024
#define check_output_length(l) { \
! const ulong s = OutStr.size; \
! if (OutStr.len + l >= s) { \
ulong t = s + l + STEPSIZE; \
! OutStr.string = gprealloc(OutStr.string, t, s); \
! OutStr.size = t; \
} \
}
--- 438,452 ----
char *string;
ulong len,size;
} outString;
! static outString *OutStr;
#define STEPSIZE 1024
#define check_output_length(l) { \
! const ulong s = OutStr->size; \
! if (OutStr->len + l >= s) { \
ulong t = s + l + STEPSIZE; \
! OutStr->string = gprealloc(OutStr->string, t, s); \
! OutStr->size = t; \
} \
}
***************
*** 454,460 ****
outstr_putc(char c)
{
check_output_length(1);
! OutStr.string[OutStr.len++] = c;
}
static void
--- 454,460 ----
outstr_putc(char c)
{
check_output_length(1);
! OutStr->string[OutStr->len++] = c;
}
static void
***************
*** 462,469 ****
{
long len=strlen(s);
check_output_length(len);
! strcpy(OutStr.string+OutStr.len,s);
! OutStr.len += len;
}
static void
--- 462,469 ----
{
long len=strlen(s);
check_output_length(len);
! strcpy(OutStr->string+OutStr->len,s);
! OutStr->len += len;
}
static void
***************
*** 484,496 ****
GENtostr0(GEN x, void(*do_out)(GEN))
{
PariOUT *tmp = pariOut;
if (typ(x) == t_STR) return pari_strdup(GSTR(x));
! pariOut = &pariOut2Str;
! OutStr.len = 0; OutStr.size=0; OutStr.string=NULL;
! do_out(x); OutStr.string[OutStr.len] = 0;
! pariOut = tmp; return OutStr.string;
}
char *
--- 484,497 ----
GENtostr0(GEN x, void(*do_out)(GEN))
{
PariOUT *tmp = pariOut;
+ outString *tmps = OutStr, newStr;
if (typ(x) == t_STR) return pari_strdup(GSTR(x));
! pariOut = &pariOut2Str; OutStr = &newStr;
! OutStr->len = 0; OutStr->size=0; OutStr->string=NULL;
! do_out(x); OutStr->string[OutStr->len] = 0;
! pariOut = tmp; OutStr = tmps; return newStr.string;
}
char *
***************
*** 1446,1456 ****
pariputc(')'); break;
case t_RFRAC: case t_RFRACN:
{
! char *v1 = GENtostr0((GEN)g[1], &outsor);
! char *v2 = GENtostr0((GEN)g[2], &outsor);
! long sd = 0, sn = 0, n = strlen(v1), d = strlen(v2);
long wd = term_width();
pariputc('\n');
i = max(n,d)+2;
--- 1447,1461 ----
pariputc(')'); break;
case t_RFRAC: case t_RFRACN:
+ if (initial)
{
! char *v1, *v2;
! long sd = 0, sn = 0, d,n;
long wd = term_width();
+
+ initial = 0;
+ v1 = GENtostr0((GEN)g[1], &sori); n = strlen(v1);
+ v2 = GENtostr0((GEN)g[2], &sori); d = strlen(v2);
pariputc('\n');
i = max(n,d)+2;
***************
*** 1469,1474 ****
--- 1474,1481 ----
blancs(sd+1); pariputs(v2);
pariputc('\n'); return;
}
+ pariputc('('); sori((GEN)g[1]); pariputs(" / "); sori((GEN)g[2]);
+ pariputc(')'); return;
case t_QFR: case t_QFI: pariputc('{');
sori((GEN)g[1]); pariputs(", ");
***************
*** 1693,1699 ****
sor(GEN g, char f, long d, long c)
{
long av=avma; sp = &wr_space;
! format = f; decimals = d; chmp = c;
sori(changevar(g,polvar)); avma = av;
}
--- 1700,1706 ----
sor(GEN g, char f, long d, long c)
{
long av=avma; sp = &wr_space;
! format = f; decimals = d; chmp = c; initial = 1;
sori(changevar(g,polvar)); avma = av;
}
--
Karim Belabas email: Karim.Belabas@math.u-psud.fr
Dep. de Mathematiques, Bat. 425
Universite Paris-Sud Tel: (00 33) 1 69 15 57 48
F-91405 Orsay (France) Fax: (00 33) 1 69 15 60 19
--
PARI/GP Home Page: http://pari.home.ml.org