mini-gmp: mpz_init_set_str fails on leading zeroes
Austyn Krutsinger
akrutsinger at gmail.com
Wed Jul 20 19:29:44 UTC 2016
My initial though was to just skip the leading zero's in the mpz_set_str
function by something like this:
while (isspace( (unsigned char) *sp) || (*sp == '0'))
sp++;
Only problems is that this doesn't work for negative numbers that still
have a bunch of leading zeros;
mpz_t v;
mpz_init_set_str(v, "-00000000000000000005", 10);
would it be too inefficient to do another check for zeros within
mpz_set_str right after the check for the sign?
while (isspace( (unsigned char) *sp) || (*sp == '0'))
sp++;
sign = (*sp == '-');
sp += sign;
while (*sp == '0')
sp++;
if (base == 0)
{
if (*sp == '0')
{
sp++;
......
Regards,
Austyn
On Wed, Jul 20, 2016 at 8:04 PM, Axel Miller <axel.miller at ppi.de> wrote:
> Hi!
>
> The execution of the following code snippet fails with an assertion
> "mini-gmp.c:502: mpn_mul_1: Assertion `n >= 1' failed.":
>
> mpz_t v;
> mpz_init_set_str(v, "00000000000000000005", 10);
>
>
> If I remove the leading zeroes, everythine works fine.
>
> I used mini-gmp.c from GMP 6.1.1.
>
> Output from uname -a and gcc --version:
>
> mil at mil-vm-debian64-1:~/mini-gmp$ uname -a
> Linux mil-vm-debian64-1 2.6.32-5-amd64 #1 SMP Tue May 13 16:34:35 UTC 2014
> x86_64 GNU/Linux
>
> mil at mil-vm-debian64-1:~/mini-gmp$ gcc --version
> gcc (Debian 4.4.5-8) 4.4.5
> Copyright (C) 2010 Free Software Foundation, Inc.
> This is free software; see the source for copying conditions. There is NO
> warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR
> PURPOSE.
>
>
> The error seems to be in function mpn_set_str_other.
> With a sufficient number of leading zeroes in sp, the computation in lines
> 1314-1317 will assign zero to the variable w.
>
> 1314 j = 0;
> 1315 w = sp[j++];
> 1316 while (--k != 0)
> 1317 w = w * b + sp[j++];
> 1318
>
> If we have some digits left, j will still be smaller than sn. Thus, the
> loop in line 1321 will be executed at least once:
>
> 1321 for (rn = (w > 0); j < sn;)
> 1322 {
> 1323 mp_limb_t cy;
> 1324
> 1325 w = sp[j++];
> 1326 for (k = 1; k < info->exp; k++)
> 1327 w = w * b + sp[j++];
> 1328
> 1329 cy = mpn_mul_1 (rp, rp, rn, info->bb);
> 1330 cy += mpn_add_1 (rp, rp, rn, w);
> 1331 if (cy > 0)
> 1332 rp[rn++] = cy;
> 1333 }
> 1334 assert (j == sn);
> 1321 for (rn = (w > 0); j < sn;)
>
> Since w is zero, the loop will assing zero to rn at the beginning.
> This causes the assertion in mpn_mul_1 (called in line 1329).
>
>
> HTH
> Axel Miller
> _______________________________________________
> gmp-bugs mailing list
> gmp-bugs at gmplib.org
> https://gmplib.org/mailman/listinfo/gmp-bugs
More information about the gmp-bugs
mailing list