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

Masakazu Ishida ishida-mxb @ necst.nec.co.jp
2009年 1月 27日 (火) 13:35:38 JST


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

以上です。



openrtm-users メーリングリストの案内