<div dir="ltr">産技研 佐々木様:<br><br>産総研の原です。<br>ご報告ありがとうございます。<br>ご指摘の通りだと思います。現在の実装では、安全なコードとは言えませんね…。<br><br>ご提案のいずれかの方法で改修を検討したいと思います。<br><br>以上、よろしくお願いいたします。<br><br></div><div class="gmail_extra"><br><br><div class="gmail_quote">
2014年6月26日 22:09  <span dir="ltr"><<a href="mailto:sasaki.akinori@iri-tokyo.jp" target="_blank">sasaki.akinori@iri-tokyo.jp</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
東京都立産業技術研究センターの佐々木と申します。<br>
<br>
<br>
既知の内容かもしれませんが,下記のような coil の実行時エラーに<br>
遭遇しましたので報告いたします。<br>
<br>
<br>
テスト環境<br>
--------------<br>
- OpenRTM-aist-1.1.0-RELEASE (C++版), 32bit Windows版<br>
<br>
- Visual C++ 2010 Express Edition, 32bit<br>
<br>
  RTCBuilder + CMake で生成したソリューションファイルを利用し,<br>
  [Debug] 構成でRTコンポーネントをビルド<br>
<br>
- Windows 7 Professional (64bit)<br>
<br>
  (ただし,潜在的には環境に依存しないエラー)<br>
<br>
<br>
実行時エラーの内容<br>
----------------------<br>
RTコンポーネント(スタンドアローン)のロード時に<br>
次のような assert 失敗 との メッセージウィンドウが表示される。<br>
<br>
      C:\***\xxxcomp.exe<br>
      File: c:\program files\microsoft visual studio 10.0\vc\include\xstring<br>
      Line: 1441<br>
<br>
      Expression: string subscript out of range<br>
<br>
      For information on how your program can cause an assertion<br>
      failure, see the Visual C++ documentation on asserts.<br>
<br>
      (Press Retry to debug the application)<br>
<br>
<br>
<br>
実行時エラーが発生する条件<br>
--------------------------------<br>
- RTコンポーネントが読み込んだ rtc.conf に空白行があること<br>
  (行の位置には依存しない)<br>
<br>
<br>
原因<br>
-------------<br>
coil::Properties::load() の実装<br>
<br>
In trunk/OpenRTM-aist/src/lib/coil/common/Properties.cpp, Line 344--349:<br>
(OpenRTM-aist-1.1.0-RELEASE においては,  */src/lib/coil/win32/coil/Properties.cpp)<br>
<br>
   342      while(!inStream.eof())<br>
   343        {<br>
   344          std::string tmp;<br>
   345          coil::getlinePortable(inStream, tmp);<br>
   346          coil::eraseHeadBlank(tmp);<br>
   347<br>
   348          // Skip comments or empty lines<br>
   349          if (tmp[0] == '#' || tmp[0] == '!' || tmp == "") continue;<br>
   // 以下略<br>
<br>
   --> tmp.empty() == true のとき 第0要素も存在しないので<br>
       tmp[0] の評価時点で operator[] の実行中のどこかで assert に失敗する<br>
<br>
<br>
改善案<br>
---------<br>
<br>
  349c349<br>
  <       if (tmp[0] == '#' || tmp[0] == '!' || tmp == "") continue;<br>
  ---<br>
  >       if (tmp.empty() || tmp[0] == '#' || tmp[0] == '!') continue;<br>
<br>
 --> ||演算子のオペランドは左から右に向かう順序で評価される<br>
     <a href="https://www.jpcert.or.jp/sc-rules/c-exp10-c.html" target="_blank">https://www.jpcert.or.jp/sc-rules/c-exp10-c.html</a><br>
<br>
<br>
もしくは,評価順序の知識なしで,実装の妥当性を判断できるように次のように変更<br>
<br>
  349c349,350<br>
  <       if (tmp[0] == '#' || tmp[0] == '!' || tmp == "") continue;<br>
  ---<br>
  >       if (tmp.empty()) continue;<br>
  >       if (tmp[0] == '#' || tmp[0] == '!') continue;<br>
<br>
<br>
--<br>
地方独立行政法人 東京都立産業技術研究センター<br>
事業化支援本部 技術開発支援部 ロボット開発セクター<br>
佐々木 智典<br>
<br>
<br>
_______________________________________________<br>
openrtm-users mailing list<br>
<a href="mailto:openrtm-users@openrtm.org">openrtm-users@openrtm.org</a><br>
<a href="http://www.openrtm.org/mailman/listinfo/openrtm-users" target="_blank">http://www.openrtm.org/mailman/listinfo/openrtm-users</a><br>
</blockquote></div><br><br clear="all"><br>-- <br><div dir="ltr">------------------------------------------------------------<br>産業技術総合研究所   知能システム研究部門<br> ディペンダブルシステム研究グループ 主任研究員<br> ソフトウェアプラットフォーム研究班 班長<br>  原  功 <<a href="mailto:Isao-Hara@aist.go.jp" target="_blank">Isao-Hara@aist.go.jp</a>><br>
 Isao HARA, Senior Researcher, ISRI, ,AIST,Japan<br> TEL: +81-29-861-5973 <br><br></div>
</div>