Actions
バグ #801
closedOpenRTM-aist(C++)-remove_organization時にSegmentationfaultが発生する問題
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;
}
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。
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