プロジェクト

全般

プロフィール

バグ #801

完了

OpenRTM-aist(C++)-remove_organization時にSegmentationfaultが発生する問題

匿名ユーザー さんが15年以上前に追加. ほぼ15年前に更新.

ステータス:
終了
優先度:
通常
担当者:
-
対象バージョン:
-
開始日:
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

以上

匿名ユーザー さんが15年以上前に更新

  • ステータス解決 から 終了 に変更

匿名ユーザー さんがほぼ15年前に更新

他の形式にエクスポート: Atom PDF