[GiNaC-devel] [SCM] GiNaC -- a C++ library for symbolic computations branch, ginac_1-5, updated. release_1-4-0-198-g8bf0597

Alexei Sheplyakov varg at metalica.kh.ua
Fri Jul 31 13:57:13 CEST 2009


Dear Jens,

On Fri, Jul 31, 2009 at 12:50:26PM +0200, Jens Vollinga wrote:

> commit eaf81b3115697a8e883848ace0ceb919cf443b2c
> Author: Jens Vollinga <jensv at balin.nikhef.nl>
> Date:   Fri Jul 31 11:14:01 2009 +0200
> 
>     Fixed cast that caused compile error on 64bit machines.

diff --git a/ginac/parser/parser.cpp b/ginac/parser/parser.cpp
index a46017d..d91b7e8 100644
--- a/ginac/parser/parser.cpp
+++ b/ginac/parser/parser.cpp
@@ -66,8 +66,16 @@ ex parser::parse_identifier_expr()
                Parse_error_("no function \"" << name << "\" with " <<
                             args.size() << " arguments");
        }
-       ex ret = GiNaC::function(reinterpret_cast<unsigned>(reader->second), args);
-       return ret;
+       // dirty hack to distinguish between serial numbers of functions and real
+       // pointers.
+       ex ret;
+       try {
+               ret = GiNaC::function(reinterpret_cast<unsigned>(reader->second), args);
+       }
+       catch ( std::runtime_error ) {
+               ret = reader->second(args);
+       }
+    return ret;
 }

I'm afraid this code is a bit dangerous.

Suppose reader->second corresponds to the serial of some (GiNaC::)function
(and not a pointer to a C++ function). ret = GiNaC::function(...) calls
eval(), and it might throw an exception. We catch the exception and
dereference ->second => oops...

Best regards,
	Alexei




More information about the GiNaC-devel mailing list