Project

General

Profile

Actions

バグ #801

closed

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

Added by Anonymous about 15 years ago. Updated over 14 years ago.

Status:
終了
Priority:
通常
Assignee:
-
Target version:
-
Start date:
07/17/2009
Due date:
% Done:

100%

Estimated time:

Description

単体テストを行った際、
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;
}
Actions #1

Updated by Anonymous about 15 years ago

  • Status changed from 新規 to 解決
  • % Done changed from 0 to 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。

Actions #2

Updated by Anonymous about 15 years ago

●●原因判明

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

以上

Actions #3

Updated by Anonymous about 15 years ago

  • Status changed from 解決 to 終了
Actions #4

Updated by Anonymous over 14 years ago

Actions

Also available in: Atom PDF