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

2 個の投稿 / 0 new
最終投稿
root
オフライン
Last seen: 9時間 50分 前
登録日: 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

以上です。

未定義
root
オフライン
Last seen: 9時間 50分 前
登録日: 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

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

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

コメントを投稿するにはログインまたはユーザー登録を行ってください

ダウンロード

最新バージョン : 2.0.1-RELESE

統計

Webサイト統計
ユーザ数:2209
プロジェクト統計
RTコンポーネント307
RTミドルウエア35
ツール22
文書・仕様書2

Choreonoid

モーションエディタ/シミュレータ

OpenHRP3

動力学シミュレータ

OpenRTP

統合開発プラットフォーム

産総研RTC集

産総研が提供するRTC集

TORK

東京オープンソースロボティクス協会

DAQ-Middleware

ネットワーク分散環境でデータ収集用ソフトウェアを容易に構築するためのソフトウェア・フレームワーク