[GiNaC-devel] Crash during startup
Qin An
qin.an at 163.com
Fri Jan 7 09:25:04 CET 2005
Hi,
The patch written by Chris can fix the problem that I posted on 28 Dec 2004, right?
Because I found that the cause for that error is not only setting the compiler option -fexceptions...
Best wishes,
-Qin An
>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.
>--
More information about the GiNaC-devel
mailing list