mpq_class(0, 1) segfaults (libgmpxx)

gsauthof at techfak.uni-bielefeld.de gsauthof at techfak.uni-bielefeld.de
Mon Feb 8 21:20:31 CET 2010


Hi,

I tried to initialize mpq_class with 0/1, which results in a segfault.

I did this after reading the libgmpxx documentation about the mpq_class API [1] :

void mpq_class::mpq_class (integer num, integer den)
 
 Construct an mpq_class. The initial value can be a single value of any
 type, or a pair of integers (mpz_class or standard C++ integer types)
 representing a fraction, except that long long and long double are not
 supported. For example, 
           mpq_class q (1, 3);

Strange, a minimal example to reproduce it:

$ cat ratio.cc
#include <gmpxx.h>                                                                  
                                                                                    
int main()                                                                          
{                                                                                   
#ifdef CRASH_ME                                                                     
  mpq_class *r = new mpq_class(0, 1);                                               
#else                                                                               
  mpq_class *r = new mpq_class(mpz_class(0), mpz_class(1));                         
#endif                                                                              
  return 0;                                                                         
}

$ g++ -g ratio.cc  -lgmpxx -o ratio -DCRASH_ME
$ ./ratio 
Segmentation fault (core dumped)

It looks like with CRASH_ME defined following constructor is used:

__gmp_expr(const char *s, int base)

But if we use mpq_class(1, 3) like in the example from the documentation
this constructor is used:

__gmp_expr(const mpz_class &num, const mpz_class &den)

Not defining CRASH_ME shows the above workaround in effect:

$ g++ -g ratio.cc  -lgmpxx -o ratio
$ ./ratio

I am using libgmp(xx) 4.3.1, as packaged with Ubuntu 9.10 (AMD64 architecture).

$ g++ --version
g++ (Ubuntu 4.4.1-4ubuntu9) 4.4.1

Best regards
Georg

[1] http://gmplib.org/manual/C_002b_002b-Interface-Rationals.html#C_002b_002b-Interface-Rationals

-- 
Sick of Stadtbibliothek? -> Check out http://www.tauschticket.de


More information about the gmp-bugs mailing list