overflow in LIMBS_PER_DIGIT_IN_BASE

Torbjorn Granlund tg at gmplib.org
Tue Dec 17 11:18:29 UTC 2013


Zimmermann Paul <Paul.Zimmermann at inria.fr> writes:

  with ABI=32, the macro LIMBS_PER_DIGIT_IN_BASE might overflow for large input
  strings, as demonstrated by the following program: mp_bases[b].log2b is
  3196634803, thus with ndigits=721334514 we have
  _ph = floor(3196634803*ndigits/2^32) = 536870912 = 2^29, then 8*_ph = 2^32
  overflows to 0, and the return value is 2. As a consequence, this leads to
  an out-of-bound write and the program aborts (here I've added some debug
  statements to print intermediate values):
  
  #define N 721334514
  #define B 62
  
721334514*log(62)/log(2) > 2^32 which means this is outside of the
claimed precision of 2^32 bits on a 32-bit computer.

That's why that macro is written in an overflowish manner.  One could
make it more resilient to overflow when 8 | GMP_LIMB_BITS, but I see no
point in such a change.

A possible improvement would be to detect the anomalous situation in
mpz_set_str, and issue an overflow error.  I'll put that on my todo
list, but won't do it soon.

Torbjörn
Please encrypt, key id 0xC8601622

"A week in the lab saves an hour in the library."


More information about the gmp-bugs mailing list