ports/108855: please apply two patches for libgmp4

maho nakata maho at FreeBSD.org
Wed Feb 7 01:30:21 UTC 2007


>Number:         108855
>Category:       ports
>Synopsis:       please apply two patches for libgmp4
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          update
>Submitter-Id:   current-users
>Arrival-Date:   Wed Feb 07 01:30:18 GMT 2007
>Closed-Date:
>Last-Modified:
>Originator:     maho nakata
>Release:        6.2-RELEASE
>Organization:
private
>Environment:
FreeBSD satie.private.org 6.2-RELEASE FreeBSD 6.2-RELEASE #0: Mon Jan 15 08:55:26 JST 2007     maho at satie.private.org:/usr/src/sys/i386/compile/MAHO  i386

>Description:
ports/math/libgmp4 (4.2.1) is known to have some bugs after the release:

http://www.swox.com/gmp/#STATUS
There are two bugs which are official fix and affect for FreeBSD, and 
not yet applied for FreeBSD ports.

1. [2006-11-30] With the C++ wrapper, ternary operations such as a=c+b*a where the desination variable is also used as a source, will compute garbage.
2. [2006-09-23] In mpz_set_d, arguments smaller than 1e-19 will trigger undefined behaviour, typically a crash. Note that this is a somewhat deegnerate use of mpz_set_d that should not normally happen, since any arguments < 1 will yield 0. 

>How-To-Repeat:

>Fix:
Here is the patch.

1. applying two patches.
2. bump port revision.

--- ports/math/libgmp4/Makefile	Thu Feb  1 11:41:47 2007
+++ ports/math/libgmp4.new/Makefile	Wed Feb  7 09:59:45 2007
@@ -8,7 +8,7 @@
 
 PORTNAME=	libgmp
 PORTVERSION=	4.2.1
-PORTREVISION=	1
+PORTREVISION=	2
 CATEGORIES=	math devel
 MASTER_SITES=	${MASTER_SITE_GNU}
 MASTER_SITE_SUBDIR=	gmp
diff -urN ports/math/libgmp4/files/patch-gmpxx.h.ternary ports/math/libgmp4.new/files/patch-gmpxx.h.ternary
--- ports/math/libgmp4/files/patch-gmpxx.h.ternary	Thu Jan  1 09:00:00 1970
+++ ports/math/libgmp4.new/files/patch-gmpxx.h.ternary	Wed Feb  7 10:15:53 2007
@@ -0,0 +1,522 @@
+[2006-11-30] With the C++ wrapper, ternary operations such as a=c+b*a where the desination variable is also used as a source, will compute garbage.
+http://www.swox.com/gmp/patches/gmpxx.h.ternary.diff
+
+Index: gmpxx.h
+===================================================================
+RCS file: /home/cvsfiles/gmp42/gmpxx.h,v
+retrieving revision 1.4
+retrieving revision 1.5
+diff -p -2 -r1.4 -r1.5
+*** gmpxx.h	8 Apr 2006 19:58:48 -0000	1.4
+--- gmpxx.h	31 Oct 2006 10:40:59 -0000	1.5
+*************** struct __gmp_cmp_function
+*** 1278,1367 ****
+  };
+  
+- struct __gmp_ternary_addmul // z = w + v * u
+- {
+-   static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v, mpz_srcptr u)
+-   { mpz_set(z, w); mpz_addmul(z, v, u); }
+- 
+-   static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v, unsigned long int l)
+-   { mpz_set(z, w); mpz_addmul_ui(z, v, l); }
+-   static void eval(mpz_ptr z, mpz_srcptr w, unsigned long int l, mpz_srcptr v)
+-   { mpz_set(z, w); mpz_addmul_ui(z, v, l); }
+-   static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v, signed long int l)
+-   {
+-     mpz_set(z, w);
+-     if (l >= 0)
+-       mpz_addmul_ui(z, v, l);
+-     else
+-       mpz_submul_ui(z, v, -l);
+-   }
+-   static void eval(mpz_ptr z, mpz_srcptr w, signed long int l, mpz_srcptr v)
+-   {
+-     mpz_set(z, w);
+-     if (l >= 0)
+-       mpz_addmul_ui(z, v, l);
+-     else
+-       mpz_submul_ui(z, v, -l);
+-   }
+-   static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v, double d)
+-   {
+-     mpz_t temp;
+-     mpz_init_set_d(temp, d);
+-     mpz_set(z, w);
+-     mpz_addmul(z, v, temp);
+-     mpz_clear(temp);
+-   }
+-   static void eval(mpz_ptr z, mpz_srcptr w, double d, mpz_srcptr v)
+-   {
+-     mpz_t temp;
+-     mpz_init_set_d(temp, d);
+-     mpz_set(z, w);
+-     mpz_addmul(z, temp, v);
+-     mpz_clear(temp);
+-   }
+- };
+- 
+- struct __gmp_ternary_submul // z = w - v * u
+- {
+-   static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v, mpz_srcptr u)
+-   { mpz_set(z, w); mpz_submul(z, v, u); }
+- 
+-   static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v, unsigned long int l)
+-   { mpz_set(z, w); mpz_submul_ui(z, v, l); }
+-   static void eval(mpz_ptr z, mpz_srcptr w, unsigned long int l, mpz_srcptr v)
+-   { mpz_set(z, w); mpz_submul_ui(z, v, l); }
+-   static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v, signed long int l)
+-   {
+-     mpz_set(z, w);
+-     if (l >= 0)
+-       mpz_submul_ui(z, v, l);
+-     else
+-       mpz_addmul_ui(z, v, -l);
+-   }
+-   static void eval(mpz_ptr z, mpz_srcptr w, signed long int l, mpz_srcptr v)
+-   {
+-     mpz_set(z, w);
+-     if (l >= 0)
+-       mpz_submul_ui(z, v, l);
+-     else
+-       mpz_addmul_ui(z, v, -l);
+-   }
+-   static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v, double d)
+-   {
+-     mpz_t temp;
+-     mpz_init_set_d(temp, d);
+-     mpz_set(z, w);
+-     mpz_submul(z, v, temp);
+-     mpz_clear(temp);
+-   }
+-   static void eval(mpz_ptr z, mpz_srcptr w, double d, mpz_srcptr v)
+-   {
+-     mpz_t temp;
+-     mpz_init_set_d(temp, d);
+-     mpz_set(z, w);
+-     mpz_submul(z, temp, v);
+-     mpz_clear(temp);
+-   }
+- };
+- 
+  struct __gmp_rand_function
+  {
+--- 1278,1281 ----
+*************** __GMPZQ_DEFINE_EXPR(__gmp_binary_minus)
+*** 2863,3277 ****
+  
+  
+- /* Integer ternary expressions of the kind `a+b*c' or `a*b+c' can be
+-    evaluated directly via mpz_addmul */
+- 
+- // a + b * c
+- #define __GMP_DEFINE_TERNARY_EXPR(eval_fun1, eval_fun2, eval_both)          \
+-                                                                             \
+- template <>                                                                 \
+- class __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr             \
+- <mpz_t, __gmp_binary_expr<mpz_class, mpz_class, eval_fun1> >, eval_fun2> >  \
+- {                                                                           \
+- private:                                                                    \
+-   typedef mpz_class val1_type;                                              \
+-   typedef __gmp_expr                                                        \
+-     <mpz_t, __gmp_binary_expr<mpz_class, mpz_class, eval_fun1> > val2_type; \
+-                                                                             \
+-   __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr;                  \
+- public:                                                                     \
+-   __gmp_expr(const val1_type &val1, const val2_type &val2)                  \
+-     : expr(val1, val2) { }                                                  \
+-   void eval(mpz_ptr z) const                                                \
+-   { eval_both::eval                                                         \
+-       (z, expr.val1.get_mpz_t(), expr.val2.get_val1().get_mpz_t(),          \
+-        expr.val2.get_val2().get_mpz_t()); }                                 \
+-   const val1_type & get_val1() const { return expr.val1; }                  \
+-   const val2_type & get_val2() const { return expr.val2; }                  \
+-   unsigned long int get_prec() const { return mpf_get_default_prec(); }     \
+- };                                                                          \
+-                                                                             \
+- template <class T>                                                          \
+- class __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr             \
+- <mpz_t, __gmp_binary_expr<mpz_class, T, eval_fun1> >, eval_fun2> >          \
+- {                                                                           \
+- private:                                                                    \
+-   typedef mpz_class val1_type;                                              \
+-   typedef __gmp_expr                                                        \
+-     <mpz_t, __gmp_binary_expr<mpz_class, T, eval_fun1> > val2_type;         \
+-                                                                             \
+-   __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr;                  \
+- public:                                                                     \
+-   __gmp_expr(const val1_type &val1, const val2_type &val2)                  \
+-     : expr(val1, val2) { }                                                  \
+-   void eval(mpz_ptr z) const                                                \
+-   { eval_both::eval                                                         \
+-       (z, expr.val1.get_mpz_t(), expr.val2.get_val1().get_mpz_t(),          \
+-        expr.val2.get_val2()); }                                             \
+-   const val1_type & get_val1() const { return expr.val1; }                  \
+-   const val2_type & get_val2() const { return expr.val2; }                  \
+-   unsigned long int get_prec() const { return mpf_get_default_prec(); }     \
+- };                                                                          \
+-                                                                             \
+- template <class T>                                                          \
+- class __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr             \
+- <mpz_t, __gmp_binary_expr<T, mpz_class, eval_fun1> >, eval_fun2> >          \
+- {                                                                           \
+- private:                                                                    \
+-   typedef mpz_class val1_type;                                              \
+-   typedef __gmp_expr                                                        \
+-     <mpz_t, __gmp_binary_expr<T, mpz_class, eval_fun1> > val2_type;         \
+-                                                                             \
+-   __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr;                  \
+- public:                                                                     \
+-   __gmp_expr(const val1_type &val1, const val2_type &val2)                  \
+-     : expr(val1, val2) { }                                                  \
+-   void eval(mpz_ptr z) const                                                \
+-   { eval_both::eval                                                         \
+-       (z, expr.val1.get_mpz_t(), expr.val2.get_val1(),                      \
+-        expr.val2.get_val2().get_mpz_t()); }                                 \
+-   const val1_type & get_val1() const { return expr.val1; }                  \
+-   const val2_type & get_val2() const { return expr.val2; }                  \
+-   unsigned long int get_prec() const { return mpf_get_default_prec(); }     \
+- };                                                                          \
+-                                                                             \
+- template <class T>                                                          \
+- class __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr             \
+- <mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr<mpz_t, T>, eval_fun1> >,    \
+-   eval_fun2> >                                                              \
+- {                                                                           \
+- private:                                                                    \
+-   typedef mpz_class val1_type;                                              \
+-   typedef __gmp_expr<mpz_t, __gmp_binary_expr                               \
+-     <mpz_class, __gmp_expr<mpz_t, T>, eval_fun1> > val2_type;               \
+-                                                                             \
+-   __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr;                  \
+- public:                                                                     \
+-   __gmp_expr(const val1_type &val1, const val2_type &val2)                  \
+-     : expr(val1, val2) { }                                                  \
+-   void eval(mpz_ptr z) const                                                \
+-   {                                                                         \
+-     mpz_class temp(expr.val2.get_val2());                                   \
+-     eval_both::eval                                                         \
+-       (z, expr.val1.get_mpz_t(), expr.val2.get_val1().get_mpz_t(),          \
+-        temp.get_mpz_t());                                                   \
+-   }                                                                         \
+-   const val1_type & get_val1() const { return expr.val1; }                  \
+-   const val2_type & get_val2() const { return expr.val2; }                  \
+-   unsigned long int get_prec() const { return mpf_get_default_prec(); }     \
+- };                                                                          \
+-                                                                             \
+- template <class T>                                                          \
+- class __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr             \
+- <mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, mpz_class, eval_fun1> >,    \
+-   eval_fun2> >                                                              \
+- {                                                                           \
+- private:                                                                    \
+-   typedef mpz_class val1_type;                                              \
+-   typedef __gmp_expr<mpz_t, __gmp_binary_expr                               \
+-     <__gmp_expr<mpz_t, T>, mpz_class, eval_fun1> > val2_type;               \
+-                                                                             \
+-   __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr;                  \
+- public:                                                                     \
+-   __gmp_expr(const val1_type &val1, const val2_type &val2)                  \
+-     : expr(val1, val2) { }                                                  \
+-   void eval(mpz_ptr z) const                                                \
+-   {                                                                         \
+-     mpz_class temp(expr.val2.get_val1());                                   \
+-     eval_both::eval(z, expr.val1.get_mpz_t(), temp.get_mpz_t(),             \
+- 		    expr.val2.get_val2().get_mpz_t());                      \
+-   }                                                                         \
+-   const val1_type & get_val1() const { return expr.val1; }                  \
+-   const val2_type & get_val2() const { return expr.val2; }                  \
+-   unsigned long int get_prec() const { return mpf_get_default_prec(); }     \
+- };                                                                          \
+-                                                                             \
+- template <class T, class U>                                                 \
+- class __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr             \
+- <mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, U, eval_fun1> >,            \
+-   eval_fun2> >                                                              \
+- {                                                                           \
+- private:                                                                    \
+-   typedef mpz_class val1_type;                                              \
+-   typedef __gmp_expr<mpz_t, __gmp_binary_expr                               \
+-     <__gmp_expr<mpz_t, T>, U, eval_fun1> > val2_type;                       \
+-                                                                             \
+-   __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr;                  \
+- public:                                                                     \
+-   __gmp_expr(const val1_type &val1, const val2_type &val2)                  \
+-     : expr(val1, val2) { }                                                  \
+-   void eval(mpz_ptr z) const                                                \
+-   {                                                                         \
+-     mpz_class temp(expr.val2.get_val1());                                   \
+-     eval_both::eval                                                         \
+-       (z, expr.val1.get_mpz_t(), temp.get_mpz_t(), expr.val2.get_val2());   \
+-   }                                                                         \
+-   const val1_type & get_val1() const { return expr.val1; }                  \
+-   const val2_type & get_val2() const { return expr.val2; }                  \
+-   unsigned long int get_prec() const { return mpf_get_default_prec(); }     \
+- };                                                                          \
+-                                                                             \
+- template <class T, class U>                                                 \
+- class __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr             \
+- <mpz_t, __gmp_binary_expr<T, __gmp_expr<mpz_t, U>, eval_fun1> >,            \
+-   eval_fun2> >                                                              \
+- {                                                                           \
+- private:                                                                    \
+-   typedef mpz_class val1_type;                                              \
+-   typedef __gmp_expr<mpz_t, __gmp_binary_expr                               \
+-     <T, __gmp_expr<mpz_t, U>, eval_fun1> > val2_type;                       \
+-                                                                             \
+-   __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr;                  \
+- public:                                                                     \
+-   __gmp_expr(const val1_type &val1, const val2_type &val2)                  \
+-     : expr(val1, val2) { }                                                  \
+-   void eval(mpz_ptr z) const                                                \
+-   {                                                                         \
+-     mpz_class temp(expr.val2.get_val2());                                   \
+-     eval_both::eval                                                         \
+-       (z, expr.val1.get_mpz_t(), expr.val2.get_val1(), temp.get_mpz_t());   \
+-   }                                                                         \
+-   const val1_type & get_val1() const { return expr.val1; }                  \
+-   const val2_type & get_val2() const { return expr.val2; }                  \
+-   unsigned long int get_prec() const { return mpf_get_default_prec(); }     \
+- };                                                                          \
+-                                                                             \
+- template <class T, class U>                                                 \
+- class __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr             \
+- <mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, __gmp_expr<mpz_t, U>,       \
+-   eval_fun1> >, eval_fun2> >                                                \
+- {                                                                           \
+- private:                                                                    \
+-   typedef mpz_class val1_type;                                              \
+-   typedef __gmp_expr<mpz_t, __gmp_binary_expr                               \
+-     <__gmp_expr<mpz_t, T>, __gmp_expr<mpz_t, U>, eval_fun1> > val2_type;    \
+-                                                                             \
+-   __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr;                  \
+- public:                                                                     \
+-   __gmp_expr(const val1_type &val1, const val2_type &val2)                  \
+-     : expr(val1, val2) { }                                                  \
+-   void eval(mpz_ptr z) const                                                \
+-   {                                                                         \
+-     mpz_class temp1(expr.val2.get_val1());                                  \
+-     mpz_class temp2(expr.val2.get_val2());                                  \
+-     eval_both::eval                                                         \
+-       (z, expr.val1.get_mpz_t(), temp1.get_mpz_t(), temp2.get_mpz_t());     \
+-   }                                                                         \
+-   const val1_type & get_val1() const { return expr.val1; }                  \
+-   const val2_type & get_val2() const { return expr.val2; }                  \
+-   unsigned long int get_prec() const { return mpf_get_default_prec(); }     \
+- };                                                                          \
+-                                                                             \
+- template <class T>                                                          \
+- class __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>,             \
+-   __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, mpz_class, eval_fun1> >,   \
+-   eval_fun2> >                                                              \
+- {                                                                           \
+- private:                                                                    \
+-   typedef __gmp_expr<mpz_t, T> val1_type;                                   \
+-   typedef __gmp_expr                                                        \
+-     <mpz_t, __gmp_binary_expr<mpz_class, mpz_class, eval_fun1> > val2_type; \
+-                                                                             \
+-   __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr;                  \
+- public:                                                                     \
+-   __gmp_expr(const val1_type &val1, const val2_type &val2)                  \
+-     : expr(val1, val2) { }                                                  \
+-   void eval(mpz_ptr z) const                                                \
+-   {                                                                         \
+-     mpz_class temp(expr.val1);                                              \
+-     eval_both::eval(z, temp.get_mpz_t(), expr.val2.get_val1().get_mpz_t(),  \
+- 		    expr.val2.get_val2().get_mpz_t());                      \
+-   }                                                                         \
+-   const val1_type & get_val1() const { return expr.val1; }                  \
+-   const val2_type & get_val2() const { return expr.val2; }                  \
+-   unsigned long int get_prec() const { return mpf_get_default_prec(); }     \
+- };                                                                          \
+-                                                                             \
+- template <class T, class U>                                                 \
+- class __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>,             \
+-   __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, U, eval_fun1> >,           \
+-   eval_fun2> >                                                              \
+- {                                                                           \
+- private:                                                                    \
+-   typedef __gmp_expr<mpz_t, T> val1_type;                                   \
+-   typedef __gmp_expr                                                        \
+-     <mpz_t, __gmp_binary_expr<mpz_class, U, eval_fun1> > val2_type;         \
+-                                                                             \
+-   __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr;                  \
+- public:                                                                     \
+-   __gmp_expr(const val1_type &val1, const val2_type &val2)                  \
+-     : expr(val1, val2) { }                                                  \
+-   void eval(mpz_ptr z) const                                                \
+-   {                                                                         \
+-     mpz_class temp(expr.val1);                                              \
+-     eval_both::eval(z, temp.get_mpz_t(), expr.val2.get_val1().get_mpz_t(),  \
+- 		    expr.val2.get_val2());                                  \
+-   }                                                                         \
+-   const val1_type & get_val1() const { return expr.val1; }                  \
+-   const val2_type & get_val2() const { return expr.val2; }                  \
+-   unsigned long int get_prec() const { return mpf_get_default_prec(); }     \
+- };                                                                          \
+-                                                                             \
+- template <class T, class U>                                                 \
+- class __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>,             \
+-   __gmp_expr<mpz_t, __gmp_binary_expr<U, mpz_class, eval_fun1> >,           \
+-   eval_fun2> >                                                              \
+- {                                                                           \
+- private:                                                                    \
+-   typedef __gmp_expr<mpz_t, T> val1_type;                                   \
+-   typedef __gmp_expr                                                        \
+-     <mpz_t, __gmp_binary_expr<U, mpz_class, eval_fun1> > val2_type;         \
+-                                                                             \
+-   __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr;                  \
+- public:                                                                     \
+-   __gmp_expr(const val1_type &val1, const val2_type &val2)                  \
+-     : expr(val1, val2) { }                                                  \
+-   void eval(mpz_ptr z) const                                                \
+-   {                                                                         \
+-     mpz_class temp(expr.val1);                                              \
+-     eval_both::eval(z, temp.get_mpz_t(), expr.val2.get_val1(),              \
+- 		    expr.val2.get_val2().get_mpz_t());                      \
+-   }                                                                         \
+-   const val1_type & get_val1() const { return expr.val1; }                  \
+-   const val2_type & get_val2() const { return expr.val2; }                  \
+-   unsigned long int get_prec() const { return mpf_get_default_prec(); }     \
+- };                                                                          \
+-                                                                             \
+- template <class T, class U>                                                 \
+- class __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>,             \
+-   __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr<mpz_t, U>,      \
+-   eval_fun1> >, eval_fun2> >                                                \
+- {                                                                           \
+- private:                                                                    \
+-   typedef __gmp_expr<mpz_t, T> val1_type;                                   \
+-   typedef __gmp_expr<mpz_t, __gmp_binary_expr                               \
+-     <mpz_class, __gmp_expr<mpz_t, U>, eval_fun1> > val2_type;               \
+-                                                                             \
+-   __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr;                  \
+- public:                                                                     \
+-   __gmp_expr(const val1_type &val1, const val2_type &val2)                  \
+-     : expr(val1, val2) { }                                                  \
+-   void eval(mpz_ptr z) const                                                \
+-   {                                                                         \
+-     mpz_class temp1(expr.val1);                                             \
+-     mpz_class temp2(expr.val2.get_val2());                                  \
+-     eval_both::eval                                                         \
+-       (z, temp1.get_mpz_t(), expr.val2.get_val1().get_mpz_t(),              \
+-        temp2.get_mpz_t());                                                  \
+-   }                                                                         \
+-   const val1_type & get_val1() const { return expr.val1; }                  \
+-   const val2_type & get_val2() const { return expr.val2; }                  \
+-   unsigned long int get_prec() const { return mpf_get_default_prec(); }     \
+- };                                                                          \
+-                                                                             \
+- template <class T, class U>                                                 \
+- class __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>,             \
+-   __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, U>, mpz_class,      \
+-   eval_fun1> >, eval_fun2> >                                                \
+- {                                                                           \
+- private:                                                                    \
+-   typedef __gmp_expr<mpz_t, T> val1_type;                                   \
+-   typedef __gmp_expr<mpz_t, __gmp_binary_expr                               \
+-     <__gmp_expr<mpz_t, U>, mpz_class, eval_fun1> > val2_type;               \
+-                                                                             \
+-   __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr;                  \
+- public:                                                                     \
+-   __gmp_expr(const val1_type &val1, const val2_type &val2)                  \
+-     : expr(val1, val2) { }                                                  \
+-   void eval(mpz_ptr z) const                                                \
+-   {                                                                         \
+-     mpz_class temp1(expr.val1);                                             \
+-     mpz_class temp2(expr.val2.get_val1());                                  \
+-     eval_both::eval(z, temp1.get_mpz_t(), temp2.get_mpz_t(),                \
+- 		    expr.val2.get_val2().get_mpz_t());                      \
+-   }                                                                         \
+-   const val1_type & get_val1() const { return expr.val1; }                  \
+-   const val2_type & get_val2() const { return expr.val2; }                  \
+-   unsigned long int get_prec() const { return mpf_get_default_prec(); }     \
+- };                                                                          \
+-                                                                             \
+- template <class T, class U, class V>                                        \
+- class __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>,             \
+-   __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, U>, V,              \
+-   eval_fun1> >, eval_fun2> >                                                \
+- {                                                                           \
+- private:                                                                    \
+-   typedef __gmp_expr<mpz_t, T> val1_type;                                   \
+-   typedef __gmp_expr<mpz_t, __gmp_binary_expr                               \
+-   <__gmp_expr<mpz_t, U>, V, eval_fun1> > val2_type;                         \
+-                                                                             \
+-   __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr;                  \
+- public:                                                                     \
+-   __gmp_expr(const val1_type &val1, const val2_type &val2)                  \
+-     : expr(val1, val2) { }                                                  \
+-   void eval(mpz_ptr z) const                                                \
+-   {                                                                         \
+-     mpz_class temp1(expr.val1);                                             \
+-     mpz_class temp2(expr.val2.get_val1());                                  \
+-     eval_both::eval                                                         \
+-       (z, temp1.get_mpz_t(), temp2.get_mpz_t(), expr.val2.get_val2());      \
+-   }                                                                         \
+-   const val1_type & get_val1() const { return expr.val1; }                  \
+-   const val2_type & get_val2() const { return expr.val2; }                  \
+-   unsigned long int get_prec() const { return mpf_get_default_prec(); }     \
+- };                                                                          \
+-                                                                             \
+- template <class T, class U, class V>                                        \
+- class __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>,             \
+-   __gmp_expr<mpz_t, __gmp_binary_expr<U, __gmp_expr<mpz_t, V>,              \
+-   eval_fun1> >, eval_fun2> >                                                \
+- {                                                                           \
+- private:                                                                    \
+-   typedef __gmp_expr<mpz_t, T> val1_type;                                   \
+-   typedef __gmp_expr<mpz_t, __gmp_binary_expr                               \
+-     <U, __gmp_expr<mpz_t, V>, eval_fun1> > val2_type;                       \
+-                                                                             \
+-   __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr;                  \
+- public:                                                                     \
+-   __gmp_expr(const val1_type &val1, const val2_type &val2)                  \
+-     : expr(val1, val2) { }                                                  \
+-   void eval(mpz_ptr z) const                                                \
+-   {                                                                         \
+-     mpz_class temp1(expr.val1);                                             \
+-     mpz_class temp2(expr.val2.get_val2());                                  \
+-     eval_both::eval                                                         \
+-       (z, temp1.get_mpz_t(), expr.val2.get_val1(), temp2.get_mpz_t());      \
+-   }                                                                         \
+-   const val1_type & get_val1() const { return expr.val1; }                  \
+-   const val2_type & get_val2() const { return expr.val2; }                  \
+-   unsigned long int get_prec() const { return mpf_get_default_prec(); }     \
+- };                                                                          \
+-                                                                             \
+- template <class T, class U, class V>                                        \
+- class __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>,             \
+-   __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, U>,                 \
+-   __gmp_expr<mpz_t, V>, eval_fun1> >, eval_fun2> >                          \
+- {                                                                           \
+- private:                                                                    \
+-   typedef __gmp_expr<mpz_t, T> val1_type;                                   \
+-   typedef __gmp_expr<mpz_t, __gmp_binary_expr                               \
+-   <__gmp_expr<mpz_t, U>, __gmp_expr<mpz_t, V>, eval_fun1> > val2_type;      \
+-                                                                             \
+-   __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr;                  \
+- public:                                                                     \
+-   __gmp_expr(const val1_type &val1, const val2_type &val2)                  \
+-     : expr(val1, val2) { }                                                  \
+-   void eval(mpz_ptr z) const                                                \
+-   {                                                                         \
+-     mpz_class temp1(expr.val1);                                             \
+-     mpz_class temp2(expr.val2.get_val1());                                  \
+-     mpz_class temp3(expr.val2.get_val2());                                  \
+-     eval_both::eval                                                         \
+-       (z, temp1.get_mpz_t(), temp2.get_mpz_t(), temp3.get_mpz_t());         \
+-   }                                                                         \
+-   const val1_type & get_val1() const { return expr.val1; }                  \
+-   const val2_type & get_val2() const { return expr.val2; }                  \
+-   unsigned long int get_prec() const { return mpf_get_default_prec(); }     \
+- };
+- 
+- 
+- __GMP_DEFINE_TERNARY_EXPR(__gmp_binary_multiplies, __gmp_binary_plus,
+- 			  __gmp_ternary_addmul)
+- __GMP_DEFINE_TERNARY_EXPR(__gmp_binary_multiplies, __gmp_binary_minus,
+- 			  __gmp_ternary_submul)
+  
+  /**************** Macros for defining functions ****************/
+--- 2777,2780 ----
diff -urN ports/math/libgmp4/files/patch-mpz_set_d ports/math/libgmp4.new/files/patch-mpz_set_d
--- ports/math/libgmp4/files/patch-mpz_set_d	Thu Jan  1 09:00:00 1970
+++ ports/math/libgmp4.new/files/patch-mpz_set_d	Wed Feb  7 10:16:16 2007
@@ -0,0 +1,15 @@
+[2006-09-23] In mpz_set_d, arguments smaller than 1e-19 will trigger undefined behaviour, typically a crash. Note that this is a somewhat deegnerate use of mpz_set_d that should not normally happen, since any arguments < 1 will yield 0.
+http://www.swox.com/gmp/patches/mpz_set_d.diff
+
+*** mpz/set_d.c	14 Mar 2006 15:57:54 -0000	1.1
+--- mpz/set_d.c	31 May 2006 14:50:05 -0000	1.2
+*************** mpz_set_d (mpz_ptr r, double d)
+*** 57,60 ****
+--- 58,64 ----
+      _mpz_realloc (r, rn);
+  
++   if (rn <= 0)
++     rn = 0;
++ 
+    rp = PTR (r);
+  

>Release-Note:
>Audit-Trail:
>Unformatted:



More information about the freebsd-ports-bugs mailing list