操作
バグ #801
完了OpenRTM-aist(C++)-remove_organization時にSegmentationfaultが発生する問題
ステータス:
終了
優先度:
通常
担当者:
-
対象バージョン:
-
開始日:
2009/07/17
期日:
進捗率:
100%
予定工数:
説明
単体テストを行った際、
add_organization()後に remove_organization()を実行すると「Segmentation fault」が発生する。
CORBA::Boolean
Configuration_impl::remove_organization(const char* organization_id)
throw (CORBA::SystemException,
InvalidParameter, NotAvailable, InternalError)
{
RTC_TRACE(("remove_organization(%s)", organization_id));
try
{
Guard gurad(m_org_mutex);
CORBA_SeqUtil::erase_if(m_organizations, org_id(organization_id)); ★ここで落ちる
}
catch (...)
{
throw InternalError("Configuration::remove_organization");
// never reach here
return false;
}
return true;
}
匿名ユーザー さんが15年以上前に更新
- ステータス を 新規 から 解決 に変更
- 進捗率 を 0 から 100 に変更
●原因の特定
erase_if()から呼ばれている「org_id(organization_id)」に問題があったようだ。
★2 から抜ける際に、落ちていた模様。
① OpenRTM-aist/src/lib/rtm/SdoConfiguration.h
struct org_id
{
org_id(const char* id) : m_id(id) {};
bool operator()(const Organization_ptr& o)
{
CORBA::String_var id(o->get_organization_id());
return m_id == (const char *)id; ★2
}
const std::string m_id;
};
② OpenRTM-aist/src/lib/rtm/SdoOrganization.cpp
char* Organization_impl::get_organization_id()
throw (CORBA::SystemException,
InvalidParameter, NotAvailable, InternalError)
{
RTC_TRACE(("get_organization_id() = %s", m_pId));
return CORBA::string_dup(m_pId); ★1
}
●対処
① OpenRTM-aist/src/lib/rtm/SdoConfiguration.h
struct org_id
{
org_id(const char* id) : m_id(id) {};
bool operator()(const Organization_ptr& o)
{
// CORBA::String_var id(o->get_organization_id());
// ここから -->
CORBA::String_var id(CORBA::string_dup(o->get_organization_id()));
// <-- ここまで修正
return m_id == (const char *)id;
}
const std::string m_id;
};
② OpenRTM-aist/src/lib/rtm/SdoOrganization.cpp
char* Organization_impl::get_organization_id()
throw (CORBA::SystemException,
InvalidParameter, NotAvailable, InternalError)
{
RTC_TRACE(("get_organization_id() = %s", m_pId));
// return CORBA::string_dup(m_pId);
// ここから -->
CORBA::String_var oid(CORBA::string_dup(m_pId));
return oid._retn();
// <-- ここまで修正
}
※対処ファイルコミット後のリビジョンは 1459。
匿名ユーザー さんが15年以上前に更新
●●原因判明
RTObjectTests.cpp テストファイルに問題があり下記の用に修正した。
オーバーライドしたclass OrganizationMockで、
virtual char* get_organization_id()
{
// return (char*) m_id;
return CORBA::string_dup(m_Id);//修正後
}
●別途:m_pIdを const char* から std::string へ変更した。
対象ファイル
SdoConfigration.h
SdoConfigration.cpp
PeriodicECSharedComposite.cpp
以上
操作