Upstream patch to remove abort() that occur during memory overflow

Marco Bodrato bodrato at mail.dm.unipi.it
Sun Sep 13 07:47:06 UTC 2020


Ciao,

Il 2020-09-03 19:22 nisse at lysator.liu.se ha scritto:
> Mustafa Mohamad <mus-m at outlook.com> writes:
> 
>> Currently GMP aborts which sends SIGBART and forcibly aborts Julia or 
>> any linked program. With the above patch,  GMP will instead throw a  
>> __GMP_ALLOC_OVERFLOW_FUNC
>> Instead of forcibly aborting
> 
> Hi, I understand aborting may be undesirable, but can you provide a bit
> more context. How do you handle the callback on overflow? If you 
> longjmp
> out, how do you arrange so that your mpz variables are in a consistent
> state?

I believe that a "safe" mpz type, is anyway difficult to obtain. We may 
say that if the result is outside of the range supported by mpz, the 
behavior is undefined.

Try the following code on a Linux or BSD system.

int
main (int argc, char *argv[])
{
   unsigned long b, e;
   mpz_t p;
   mpz_init (p);

   b = 1;
   b <<= 24;
   e = ~0UL / 24 + 1;

   mpz_ui_pow_ui (p, b, e);

   gmp_printf ("%lu ^ %lu = %Zd", b, e, p);
   mpz_clear (p);

   return 0;
}

With ABI=64 I get:
16777216 ^ 768614336404564651 = 256

With ABI=32 I get:
16777216 ^ 178956971 = 256

Not a signal, nor an abort, simply an incorrect result :-)

Anyway this patch might be a way to give a little bit more control to 
the programs using the library...

Ĝis,
m


More information about the gmp-bugs mailing list