操作
バグ #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;
  }
  匿名ユーザー さんが16年以上前に更新
- ステータス を 新規 から 解決 に変更
 - 進捗率 を 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。
匿名ユーザー さんが16年以上前に更新
●●原因判明
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
以上
操作