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
