You're right that algparam.* in Crypto++ 5.0 had a bug. It's already been fixed
in CVS. You should be able to use Crypto++ classes before entering main().

On Fri, Oct 25, 2002 at 10:11:26AM +0100, Richard Peters wrote:
> As the C++ standard describes in 3.6.2, the initialisation order of
> objects defined in different translation units is unspecified. This lead
> to the problem described below. Now my question is: What is the position
> of Crypto++ on this issue? Does it allow users to use its classes before
> entering main(), or doesn't it? If it does, then algparam.* contains a
> little bug, as described below, if it doesn't, well, then there's
> nothing to worry for Crypto++ :)
> I checked about 20 source files of Crypto++, and algparam.cpp seems to
> be the only one to use dynamic initialisation. Therefor I think that it
> would be easy for Crypto++ to allow users to use its classes before
> entering main().
> 
> Best regards,
> 
> Richard Peters
> 
> Richard Peters wrote:
> > Alexander Schmitt wrote:
> >> Hello,
> >>
> >> when I use the ECDH<ECP>::Domain class as a member property of a
> >> class an call the contructor in the of ECDH<ECP>::Domain in the
> >> following way:
> >> <snip>
> >> Then there are occuring a application crash, when the object is
> >> defined. In my case the object is defined globally in the
> >> application, so it crashs immediately.
> >
> > The global definition seems to be the problem. Inside the constructor,
> > this is used:
> >
> > line 286, file algparam.h:
> > if (valueType == g_typeidInteger && typeid(T) == typeid(int))
> >
> > line 9, file algparam.cpp:
> >
> > const std::type_info &g_typeidInteger = typeid(Integer);
> >
> > This is another global definition. The C++ standard doesn't specify
> > the order in which global definitions are initialised, and in this
> > case the compiler initialises your TestClass tc first. The reference
> > g_typeidInteger is still set to *NULL, and the valueType ==
> > g_typeidInteger crashes. The workaround is: put your TestClass tc
> > inside main(). Another option is to change
> >
> > if (valueType == g_typeidInteger && typeid(T) == typeid(int))
> >
> > to
> >
> > if (valueType == typeid(Integer) && typeid(T) == typeid(int))
> >
> > inside algparam.h
> >
> >
> >
> > Best regards,
> >
> > Richard Peters

Reply via email to