Abstract ACM の Kode Vicious コラムは私の好きなコラムの一つである.(e.g., http://doi.acm.org/10.1145/1364782.1364791 ) プログラマとして働いていると時に彼の血圧を上昇させるバグに出会う.今回のバグは global な staticconstructor と destructor が二回呼ばれるというバグである. Contents 私は global な static object を作ることを基本的に避ける.static なobject はいくつかの副作用があるからである.特に C++ ではどのようにそれらが呼ば れ るかはプログラマの制御下にない.ではなぜ私はこんなバグにあうのか,それは私の書いたコードではないからである.しかし仕事であるからには文句ばかりも言っていられない. 今回デバッグしていてわかったのは,ある static object の destructor が二回呼ばれていることである.私はそんなことが可能であることを知らなかった.C++ では static object は main が呼ばれる前に construt され,main が終了 した後に destruct され,それらの call の回数はコンパイラが一度だけに保 証 するはずだからである. しかし,どのように binary を作成するかによっては以下のようにして二度呼ぶことが可能である.アイデアは dlopen を使う以下のようなものである. main のある application に static object A を link する. static object A のある shared library S を作成する. main は S を動的に load し,unload する. あとは詳細である.コードの例を示す. example_factory.h は shared library 内部にあって application 側で利用する IExample_class を作成する factory IExample_factoryの宣言である. example_factory_impl.h, example_factory_impl.c...