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

Marc Glisse marc.glisse at
Sun Feb 27 21:20:19 CET 2011

On Sun, 27 Feb 2011, Torbjorn Granlund wrote:

> 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...

I just tried the following on a 64bit machine. Note that disabling alloca 
should help notice the issue.

#include <stdlib.h>
#include <stdio.h>
#include <gmp.h>

void* mymalloc(size_t s){
         fprintf(stderr,"malloc %zd\n",s);
         return malloc(s);
void* myrealloc(void*p,size_t old,size_t neu){
         fprintf(stderr,"realloc %zd %zd\n",old,neu);
         return realloc(p,neu);
void myfree(void*p,size_t s){
         fprintf(stderr,"free %zd\n",s);
int main(){
         mpz_t out,in;
         return 0;

Running it prints:
malloc 8
malloc 8
malloc 73125040
malloc 73125040
free 73125040
free 73125040

and the function mpn_rootrem(_internal) indeed calls TMP_ALLOC_LIMBS with 
an argument linear in k.

Marc Glisse

More information about the gmp-bugs mailing list