mini-gmp: mpz_abs_sub_bit needs more normalization

Torbjörn Granlund tg at gmplib.org
Mon Aug 25 21:24:53 UTC 2014


nisse at lysator.liu.se (Niels Möller) writes:

  I've found a bug in mini-gmp. mpz_clrbit fails and produces an
  unnormalized mpz, if one clears the most significant one bit of a
  number, and that one bit is followed by a long string of zeros.
  
  Fix:
  
  --- a/mini-gmp.c
  +++ b/mini-gmp.c
  @@ -3569,7 +3569,7 @@ mpz_abs_sub_bit (mpz_t d, mp_bitcnt_t bit_index)
   
     gmp_assert_nocarry (mpn_sub_1 (dp + limb_index, dp + limb_index,
   				 dn - limb_index, bit));
  -  dn -= (dp[dn-1] == 0);
  +  dn = mpn_normalized_size (dp, dn);
     d->_mp_size = (d->_mp_size < 0) ? - dn : dn;
   }
   
A pretty obvious bug, and the result of over-agressive optimisation
which might not have place in mini-gmp.

Will you please take a look to see if this is done in more places?  Then
fix for the 6.0 repo as well as the head repo (and perhaps 5.1 repo if
the bug is there).

  We should also add a test case.
  
I thought mini-gmp now had complete testing after my rants about it...


Torbjörn
Please encrypt, key id 0xC8601622


More information about the gmp-bugs mailing list