[openrtm-users 00745] メモリ破壊(Ver0.4.2)について

2 posts / 0 new
Last post
root
Offline
Last seen: 2 days 5 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 00745] メモリ破壊(Ver0.4.2)について

OpenRTMユーザの皆様

NECシステムテクノロジーの石田と申します。

Ver0.4.2にてメモリ破壊に遭遇しましたので報告いたします。

原因は
basic_logstream クラスがコピーコンストラクタを宣言していない
ことに起因します。
ログ出力を停止させて回避するために0.4.2においてはrtc.confに
必ず以下を記載する必要があります。
logger.enable: NO

例:

class UserComponentClass : public RTC::DataFlowComponentBase
{
MedLogbuf m_MedLogbuf;
LogStream rtcout;
}
UserComponentClass::UserComponent(RTC::Manager* manager)
: m_MedLogbuf(manager->getMedLogbuf())
, rtcout(m_MedLogbuf)

において

basic_logstream(__filebuf_type& filebuf) コンストラクタが呼び出され
basic_medlogbuf コンストラクタが呼び出されます。次にこのオブジェクトを
メンバ変数rtcout にコピーします。このとき、 (basic_logstream クラスは
コピーコンストラクタを宣言していないので)デフォルトのコピーコンストラクタが
呼び出されるため、__ostream_type(&streambuf) ではなく__ostream_type()
(=basic_medlogbuf())が呼び出されます。このため、basic_medlogbufに
おいてsetp、setgが呼び出されない状態となるため、このまま利用すると
メモリの破壊を招きます。

同じ構造がRTC::Managerクラスに存在するため、Managerがメモリ破壊を
引き起こす可能性があります。従ってManagerのログ出力を止めるために
rtc.confに必ず以下を記載する必要があります。
logger.enable: NO
以下は上記があれば不要ですが念のために指定
logger.log_level: SILENT

以上です。

Undefined
root
Offline
Last seen: 2 days 5 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 00746] メモリ破壊(Ver0.4.2)について

NECシステムテクノロジー 石田様

産総研 安藤です

ご報告ありがとうございます。
すみませんが、ご報告いただいた状況が再現できないので
もう少し詳しく状況を教えていただけないでしょうか?

> OpenRTMユーザの皆様
>
> NECシステムテクノロジーの石田と申します。
> Ver0.4.2にてメモリ破壊に遭遇しましたので報告いたします。
>
> 原因は
> basic_logstream クラスがコピーコンストラクタを宣言していない
> ことに起因します。
> ログ出力を停止させて回避するために0.4.2においてはrtc.confに
> 必ず以下を記載する必要があります。
> logger.enable: NO
>
> 例:
>
> class UserComponentClass : public RTC::DataFlowComponentBase
> {
> MedLogbuf m_MedLogbuf;
> LogStream rtcout;
> }
> UserComponentClass::UserComponent(RTC::Manager* manager)
> : m_MedLogbuf(manager->getMedLogbuf())
> , rtcout(m_MedLogbuf)
>
> において
>

以下の内容がよくわからなかったので、もう少し詳しく教えていただけないでしょうか?

> basic_logstream(__filebuf_type& filebuf) コンストラクタが呼び出され
> basic_medlogbuf コンストラクタが呼び出されます。次にこのオブジェクトを
> メンバ変数rtcout にコピーします。このとき、 (basic_logstream クラスは
> コピーコンストラクタを宣言していないので)デフォルトのコピーコンストラクタが
> 呼び出されるため、__ostream_type(&streambuf) ではなく__ostream_type()
> (=basic_medlogbuf())が呼び出されます。このため、basic_medlogbufに
> おいてsetp、setgが呼び出されない状態となるため、このまま利用すると
> メモリの破壊を招きます。

basic_medlogbuf クラスの引数なしのコンストラクタ
basic_medlogbuf()
: __streambuf_type(), m_pLogbuf(NULL)
{
// W3C standard date and time format.
m_DateFmt = "[%Y-%m-%dT%H.%M.%S%Z]";
}
が呼ばれるということでよろしいでしょうか?
確かに、これはまずいですね。
他のコンストラクタ同様setp,setgしたほうがいいと思います。

ただ、libRTCにおいて、上記のようなコンポーネントを作成した場合でも、
このコンストラクタは呼ばれることはないような気がするのですが。

ためしに、SystemLogger.h 内コンストラクタ basic_medlogbuf() を
privateにしてみたのですが、libRTC、サンプルコンポーネントともに
コンパイルが通りました。

> 同じ構造がRTC::Managerクラスに存在するため、Managerがメモリ破壊を
> 引き起こす可能性があります。従ってManagerのログ出力を止めるために
> rtc.confに必ず以下を記載する必要があります。
> logger.enable: NO
> 以下は上記があれば不要ですが念のために指定
> logger.log_level: SILENT

というわけで、メモリ破壊が起こってると判断されるにいたった状況と、
可能ならばそのような現象が起きるサンプルをご提供いただけないでしょうか?

よろしくお願いいたします。

Log in or register to post comments

Download

latest Releases : 2.0.0-RELESE

2.0.0-RELESE Download page

Number of Projects

Choreonoid

Motion editor/Dynamics simulator

OpenHRP3

Dynamics simulator

OpenRTP

Integrated Development Platform

AIST RTC collection

RT-Components collection by AIST

TORK

Tokyo Opensource Robotics Association

DAQ-Middleware

Middleware for DAQ (Data Aquisition) by KEK