[GiNaC-devel] Crash during startup

Richard B. Kreckel kreckel at thep.physik.uni-mainz.de
Thu Jan 6 23:11:03 CET 2005


Hi!

On Thu, 6 Jan 2005, Chris Dams wrote:
> > Chris, I'm afraid you introduced a new static initialization order problem
> > when you sent us your integral.cpp file.  You cannot initialize static ex
> > integral::relative_integration_error like you do in integral.cpp:206.
>
> Hmmm... Wait a minute... If I understand correctly, this means that
> initialization of integral::relative_integration_error occurs before the
> initialization of the library_init of the same file integral.o as well as
> before the initialization of all other library_init objects in all GiNaCs
> other object files. Isn't this a bit strange???

Now that you mention it...

>                                                 I mean, can't the runtime
> environment (or whatever it is called) just initialize static objects in
> the same order as they are defined in the preprocessed C++-code???

Sure.  The language guarantees exactly that.

>                                                                    If the
> order of static initialization were the same as the order of definition
> were the same, there would not be a problem, right?

Right.

But wait a minute!  The problem comes from ex::is_zero() const in
ex.h:208:  There we have the inline member function

    bool is_zero() const { extern const ex _ex0; return is_equal(_ex0); }

But have a look at utils.cpp.  Initialization jumps from all the modules
that include ex.h into the ctor of library_init and there all the numeric
objects are initialized.  But _ex0 is declared above that ctor and it is
not initialized until the module utils.o is initialized itself!  Just the
jumps into that ctor do not as a by-product initialize all the static
objects.

If that analysis is correct there appears to be a loophole in the
initialization order scheme.  I wonder how that can be fixed without
creating a big mess in utils.cpp...

> > Would you please be so kind and sent a patch to this list for my review?
>
> I would suggest the change in the attached patch, since the functions that
> are used in this patch do not seem to involve any static variables.
> Unfortunately I do not know how to test this, because at my place no crash
> occured in the first place. Do you think this is sufficient to avoid a
> crash in all cases?

Your patch seems to work, thanks a lot!  The patch below seems to fix the
problem just as well.  By virtue of ex::construct_from_double(double) it
should be equivalent to your patch.  If you have no objections, I'll
commit it.

diff -a -u -r1.2 integral.cpp
--- integral.cpp        14 Oct 2004 15:36:45 -0000      1.2
+++ integral.cpp        6 Jan 2005 21:31:23 -0000
@@ -203,7 +203,7 @@
 }

 int integral::max_integration_level = 15;
-ex integral::relative_integration_error = power(10,-8).evalf();
+ex integral::relative_integration_error = 1e-8;

 ex subsvalue(const ex & var, const ex & value, const ex & fun)
 {

Best wishes
  -richy.
-- 
Richard B. Kreckel
<http://www.ginac.de/~kreckel/>




More information about the GiNaC-devel mailing list