«前の日記(2003-10-20) 最新 次の日記(2003-10-24)»

cheep, cheep, cheep...


2003-10-23 libxml2

_ 開発中のソフトで作りこんでしまったバグに大ハマり。

libxml2 は DOM ツリー操作関数を持っている。DOMツリーの頂点には所有権の概念があり、所有権を持っているのは、ドキュメントである。また、どのドキュメントにも属さない頂点も存在する。

使っていてハマった関数は、以下の3つ。

  1. xmlAddNextSibling
  2. xmlAddPrevSibling
  3. xmlAddChild

それぞれ、右の頂点を追加、左の頂点を追加、子供の末尾に追加を行う関数だ。良く似た操作を行う3つの関数だが、実は仕様は異なる。

上の2つ(兄弟の追加)では、追加する頂点がどこかの木に属していた場合には、頂点の追加ではなく、移動の操作となる。

しかし、 xmlAddChild では、追加する頂点の所有権や、どこの木に属しているかといったことを考慮しない。したがって、xmlAddChild を頂点の移動のつもりで用いると、DOMツリー (つまりポインタで作られたグラフ構造) の破壊を引き起こしてしまう。 なんでこんな仕様になっているかは不明。