2003-10-23 libxml2
_ 開発中のソフトで作りこんでしまったバグに大ハマり。
libxml2 は DOM ツリー操作関数を持っている。DOMツリーの頂点には所有権の概念があり、所有権を持っているのは、ドキュメントである。また、どのドキュメントにも属さない頂点も存在する。
使っていてハマった関数は、以下の3つ。
- xmlAddNextSibling
- xmlAddPrevSibling
- xmlAddChild
それぞれ、右の頂点を追加、左の頂点を追加、子供の末尾に追加を行う関数だ。良く似た操作を行う3つの関数だが、実は仕様は異なる。
上の2つ(兄弟の追加)では、追加する頂点がどこかの木に属していた場合には、頂点の追加ではなく、移動の操作となる。
しかし、 xmlAddChild では、追加する頂点の所有権や、どこの木に属しているかといったことを考慮しない。したがって、xmlAddChild を頂点の移動のつもりで用いると、DOMツリー (つまりポインタで作られたグラフ構造) の破壊を引き起こしてしまう。 なんでこんな仕様になっているかは不明。