Crash when attempting to call mpz_invert in a program that uses mpq_class and mpz_class

Álvaro Begué alvaro.begue at
Fri Mar 24 21:43:13 UTC 2017

I tried some simplifications of the program and the problem went away.
Anyway, I got it down to around 10 lines, so it should be easy to see
what's going on.

Here's the laundry list:

   - The GMP version number, and if pre-packaged or patched then say so.*
   6.1 patchlevel 0. This was installed from an ubuntu package.*
   - A test program that makes it possible for us to reproduce the bug.
   Include instructions on how to run the program.

#include <gmpxx.h>

mpz_class fraction_mod_m(mpq_class x, mpz_class m) {
  mpz_t inverse;
  mpz_class den = x.get_den();
  mpz_invert(inverse, den.get_mpz_t(), m.get_mpz_t()); // Crashes
  return mpz_class(inverse);

int main() {
  mpq_class x = mpq_class(10, 21);
  mpz_class m(37);
  mpz_class z = fraction_mod_m(x, m);

Just compile it and run it. I compiled it with g++ 5.3.0, thusly:

g++ -std=c++11 kk.cpp -o kk -O3 -Wall -Wextra -lgmp -lgmpxx

   - A description of what is wrong. If the results are incorrect, in what
   way. If you get a crash, say so. *I get a crash.*
   - If you get a crash, include a stack backtrace from the debugger if
   it’s informative (‘where’ in gdb, or ‘$C’ in adb). *It doesn't seem
   particularly informative to me, but here it is, just in case.*

(gdb) bt
#0  0x00007ffff6d1c428 in __GI_raise (sig=sig at entry=6) at
#1  0x00007ffff6d1e02a in __GI_abort () at abort.c:89
#2  0x00007ffff6d5e7ea in __libc_message (do_abort=do_abort at entry=2,
fmt=fmt at entry=0x7ffff6e772e0 "*** Error in `%s': %s: 0x%s ***\n")
    at ../sysdeps/posix/libc_fatal.c:175
#3  0x00007ffff6d6c1d0 in malloc_printerr (ar_ptr=<optimized out>,
    ptr=0x400c98 <__gmp_expr<__mpq_struct [1], __mpq_struct
[1]>::__gmp_expr(__gmp_expr<__mpq_struct [1], __mpq_struct [1]>
    str=0x7ffff6e741c6 "realloc(): invalid pointer", action=3) at
#4  __GI___libc_realloc (bytes=<optimized out>,
    oldmem=0x400c98 <__gmp_expr<__mpq_struct [1], __mpq_struct
[1]>::__gmp_expr(__gmp_expr<__mpq_struct [1], __mpq_struct [1]>
const&)+62>) at malloc.c:3011
#5  realloc_hook_ini (
    ptr=0x400c98 <__gmp_expr<__mpq_struct [1], __mpq_struct
[1]>::__gmp_expr(__gmp_expr<__mpq_struct [1], __mpq_struct [1]>
    sz=<optimized out>, caller=<optimized out>) at hooks.c:41
#6  0x00007ffff6d6ad3f in __GI___libc_realloc (
    oldmem=0x400c98 <__gmp_expr<__mpq_struct [1], __mpq_struct
[1]>::__gmp_expr(__gmp_expr<__mpq_struct [1], __mpq_struct [1]>
const&)+62>, bytes=16) at malloc.c:2981
#7  0x00007ffff7b60744 in __gmp_default_reallocate () from
#8  0x00007ffff7b7735a in __gmpz_realloc () from
#9  0x00007ffff7b673c1 in __gmpz_add () from
#10 0x00007ffff7b71079 in __gmpz_invert () from
#11 0x0000000000400969 in fraction_mod_m (x=..., m=...) at kk.cpp:6
#12 0x0000000000400a64 in main () at kk.cpp:13

   - Please do not send core dumps, executables or straces.
   - The ‘configure’ options you used when building GMP, if any.* I didn't
   build GMP myself.*
   - The output from ‘configure’, as printed to stdout, with any options
   used. *I didn't build GMP myself.*
   - The name of the compiler and its version. For gcc, get the version
   with ‘gcc -v’, otherwise perhaps ‘what `which cc`’, or similar. *g++
   5.3.0, as mentioned above.*
   - The output from running ‘uname -a’.

Linux MS-7850 4.4.0-66-generic #87-Ubuntu SMP Fri Mar 3 15:29:05 UTC 2017
x86_64 x86_64 x86_64 GNU/Linux

   - The output from running ‘./config.guess’, and from running ‘
   ./configfsf.guess’ (might be the same). *Not even sure where I am
   supposed to run those.*
   - If the bug is related to ‘configure’, then the compressed contents of
   - If the bug is related to an asm file not assembling, then the contents
   of config.m4 and the offending line or lines from the temporary


More information about the gmp-bugs mailing list