Date: Wed, 7 Feb 2007 01:22:40 GMT From: maho nakata<maho@FreeBSD.org> To: freebsd-gnats-submit@FreeBSD.org Subject: ports/108855: please apply two patches for libgmp4 Message-ID: <200702070122.l171MeIA030255@www.freebsd.org> Resent-Message-ID: <200702070130.l171UIFF007543@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>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@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:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200702070122.l171MeIA030255>