mpz_root aborts for n-th root when n is very large

Torbjorn Granlund tg at gmplib.org
Sun Feb 27 16:16:53 CET 2011


Volker Lukas <vlukas at gmx.de> writes:

  the following program aborts with GMP 5.0.1, on a machine with circa 
  1.5 GB free main memory.
  --------------------------------------------
  #include "gmp.h"
  
  int main() {
    mpz_t out1, in1;
    mpz_init(out1);
    mpz_init_set_str(in1, "1", 10);
    
    mpz_root(out1, in1, 100000000000UL);
  }
  --------------------------------------------
  
  Program output is
  ------------------------------------------------
  GNU MP: Cannot allocate memory (size=7312500040)
  Aborted
  ------------------------------------------------
  
  Is this program supposed to work? If not maybe the GMP manual could 
  include a hint on how much memory is roughly required for mpz_root 
  depending on the input values.

It is supposed to work (but the argument will overflow on a 32bit
machine, or when using the 32bit ABI on a 64-bit machine).

It should require at most a few dozed bytes, not 7312500040 words...
  
  Backtrace:
  -----------------------------------------------------------------------------
  #0  0x00007ffff70b0ab5 in raise (sig=6) at 
  ../nptl/sysdeps/unix/sysv/linux/raise.c:64
  #1  0x00007ffff70b1fb6 in abort () at abort.c:92
  #2  0x00007ffff7b6e5d5 in __gmp_default_allocate (size=7312500040) at 
  memory.c:48
  #3  0x00007ffff7b6fa21 in __gmp_tmp_reentrant_alloc (markp=0x7fffffffd930, 
  size=7312500024) at tal-reent.c:53
  #4  0x00007ffff7b952d8 in mpn_rootrem_internal (rootp=0x602010, 
  remp=0x0, up=0x602030, un=1, k=100000000000, 
      approx=0) at rootrem.c:145
  #5  0x00007ffff7b95334 in __gmpn_rootrem (rootp=0x602010, remp=<value 
  optimized out>, up=0x602030, 
      un=<value optimized out>, k=<value optimized out>) at 
  rootrem.c:113
  #6  0x00007ffff7b84413 in __gmpz_root (root=0x7fffffffda90, u=0x7fffffffda80, 
  nth=<value optimized out>)
      at root.c:70
  #7  0x000000000040076b in main () at gmp.cc:8
  -----------------------------------------------------------------------------
  
Very strange.

I tested this on three quite different machines, but I couldn't
reproduce it.  I also tried running it with artificially constrained
heap size (using 'ulimit -d 1') but it still didn't fail.

This is probably another GCC bug.  I understand that you tried two
different compiles, but they might have used the same compilers.

Perhaps you could try a different compiler?  It is GMP itself you need
to compile with a different compiler, using 'configure CC="gcc-XXX"'.
If you do this, please follow up to this list.

-- 
Torbjörn


More information about the gmp-bugs mailing list