bug in gmp_printf (?)

Zimmermann Paul Paul.Zimmermann at loria.fr
Thu Aug 18 00:10:17 CEST 2011


       Torbjörn,

>   test=doprntf.c:128 GNU MP assertion failed: (p-)conv == 1 && p->prec ...
> 
> I would be grateful if some other GMP developer could help with this.
> The bug is for real, to reproduce configure with --enable-assert.  I
> haven't analysed if the ASSERT is wrong, or if it is a more serious
> issue.
> 
> All relevant code is a few lines in printf/doprntf.c.

the problem is that when ndigits is first calculated:

        ndigits = prec + 2
          + EXP(f) * (mp_bases[ABS(p->base)].chars_per_limb + (EXP(f)>=0));

EXP(f) is 0, since the number is just below 1. But in the mpf_get_str call,
we get exp=1, thus the number is rounded up to 1 (we get s=1 as significand).
Thus the assumption ndigits >= MAX (1, exp + p->prec + 2) is false.

When EXP(f)<>0, I guess the problem cannot occur, since as the comment
explains it, the number of extra zeros is either over- or under-estimated,
thus the assertion holds (it would be good if someone could double check).

The only problem can happen when EXP(f)=0. I suggest replacing prec + 2
by prec + 2 + (EXP(f) == 0) above, or by prec + 3 to be sure.

Paul

PS: apparently "make check" exercises no case with EXP(f)=0 and exp=1.


More information about the gmp-bugs mailing list