ランタイムにロードされた共有ライブラリでインスタンス化されたオブジェクトでdynamic_castを使用する際に問題が発生しましたが、クラスに別のメソッドをオーバーライドするメソッドが含まれている場合に限ります。
「AppleLLVM3.1コンパイラ」でXcode4.3を使用しています。Linuxでgccとclangを使用して同じコードをコンパイルしましたが、問題はありません。Xcodeのコンパイラのバグだと思いますが、誰かがこれを見たことがあります。前?
「test3.h」というヘッダーのクラス定義を想定します
#pragma once
class c1
{
public:
virtual ~c1 ();
virtual void foo ();
};
class c2 : public c1
{
public:
void foo () override;
};
class c3 : public c1
{
public:
};
「test3.cpp」というソースファイルの静的ライブラリの実装コードを想定します
#include "test3.h"
c1::~c1 ()
{
}
void c1::foo ()
{
}
void c2::foo ()
{
}
test2.cppというソースファイルに単純なダイナミックライブラリがあると仮定します
#include "test3.h"
extern "C"
c1 * get1 ()
{
return new c2;
}
extern "C"
c1 * get2 ()
{
return new c3;
}
test1.cppというソースファイルにある単純な実行可能アプリケーションを想定します。
#include "test3.h"
#include <dlfcn.h>
#include <iostream>
int main ()
{
auto lib (dlopen ("libtest2.dylib", RTLD_NOW | RTLD_GLOBAL));
auto a1 (dlsym (lib, "get1"));
auto a2 (dlsym (lib, "get2"));
auto f1 ((c1 * (*) ())a1);
auto f2 ((c1 * (*) ())a2);
auto o1 (f1 ());
auto o2 (f2 ());
auto d1 (dynamic_cast <c2 *> (o1));
auto d2 (dynamic_cast <c3 *> (o2));
auto result1 (d1 != 0);
auto result2 (d2 != 0);
std::cout << result1 << std::endl;
std::cout << result2 << std::endl;
}
テストプログラムを実行すると、result1はfalseになり、result2はtrueになります。result1とresult2の両方が真になることを期待しています。
誰かがこれを見たことがありますか、または回避策を考えることができますか?