2014年4月22日火曜日

C++, Boost.PropertyTree: boost::property_tree::write_iniで.iniを書き出す際に気をつけないと危ないはなし

先ずはコードと出力マズイことが起こっています、気付いた・w・?
JSONとXMLの出力では発生していない問題がINIの出力では発生してしまっています。

コードのmainの流れは、

  1. ptree オブジェクトpを生成
  2. pに"gk1", "gk2"をputで出力
  3. pに"a.k1", "a.k2", "a.k3"をputで出力
  4. pに"gk1","gk2","gk3"をputで出力(gk1, gk2は上書き、gk3は新規)
  5. pに"b.k1"をputで出力(b.k1は新規)
  6. pに"a.k2", "a.k4"をputで出力(a.k2は上書き、a.k4は新規)
  7. pをJSONでstd::coutに出力
  8. pをXMLでstd::coutに出力
  9. pをINIでstd::coutに出力
です。結果を見ると、JSONとXMLではこの手順で生成したptreeオブジェクトの書き出しが問題なく行われていますが、INIでは流れ(2)でグローバルなセクション名にputした後に、流れ(3)でセクション名aでputした後に再び流れ(4)でputしたグローバルなセクションのgk3流れ(9)の出力ではセクション名aの要素になってしまっています。

ちなみに流れ(4)の後で流れ(5)や流れ(6)でputした新規のb.k1や上書きのa.k2と新規のa.k4は正常な位置に書きだされています。

boost::property_tree::ptreeboost::property_tree::write_iniを使う際には、グローバルなセクションを使わないように気をつけるか、或いはセクションを使わずにグローバルセクションのみを扱うように気をつけないと事故に遭遇するかもしれません。

DOM構造をまともに扱えるJSONかXMLを使えるのなら、安易に入出力にINIを選ばずJSONかXMLを採用できれば良いのだけど(╹◡╹)

<追記>

Boostにバグレポートはあがってましたが放置されてるみたい。

0 件のコメント:

コメントを投稿