SEGV?

あらら、実際にどっかで SEGV りましたか? write_ss_scan() は、write/ss する datum の子要素のうち INTERESTINGP() なものは全て登録するので、get_shared_index() の時点で NULL が返ってくるようなら、登録 logic と出力 logic が噛みあっていません。
;; あるいは hash table の欠陥。
;; 最初はそういう comment を書いてたはずなんですが、
;; 何かの拍子に消しちゃったみたいですね。すんません。
例えば閉包の code は出力対象になるのに write_ss_scan() がそれを traverse してなかったとか (実話)。get_shared_index() に NULL check が入ってないのは本質ではありません。
これで思い出したけど、DBG(), CDBG() だけではなくて (標準 C の) assert() も使った方がいいと思うんですけど、どうですか? そこの code はまさに assert (ent) を埋めるべきところです。if (ent) じゃない。いや、library にする事を考えると両方の方がいいかも知れないけど、その場合 NULL 時に適切な処理は pass ではなくて error です。再帰的 datum の認識に失敗して死ぬ可能性があるから。

ところで write/ss に限って言えば、出力時の INTERESTINGP() を無くしてしまって、その判定も hash 登録状況に頼る事で単純化にはなります。どうせ一つ減るだけですが。