C言語を使っていたときに良く出会った光景

有機化学はさっぱりわからないのでオチの素晴らしさがわからなかったのだけど、このような恐怖話の構造は良く出会うように思う。

話変わって思い出したので、文字列を扱うプログラム(実際にはASCII文字で表示した論理式)をC言語で作っていたとき、よく謎のエラーに直面した。その原因は文字列長にまつわるエラー。以下のページで解説されているとおり。「自分が扱いたい文字列+改行コード+ヌル文字」を文字列長と考えなければならないのに、「自分が扱いたい文字列」で文字列長を考えてしまうためにしょっちゅうバグを埋め込んでいた。

開発時点でのテストデータでは、コードで指定したいる文字列長よりもかなり短い文字列しか扱わないので、バグに気が付かないのだけど、いざ、実験を始めて、一週間くらいプログラムを流した後に発生する謎のエラー。たいてい、配列を超えて文字列を格納しようとするため、隣接のメモリ領域を使っている変数の値が破壊され、謎の挙動になる。

謎の挙動をおっていこうとして、テストデータで探るも再現されない。無駄なデバッグにいに2週間ぐらい費やし、やっと気が付く「ああ、最大文字列長の見積もりが足りていない」「ああ、デバッガー使えばすぐにわかったはずなのに」。

今は、文字列を扱うプログラムはPerlRubyで書くようにしているので幸せ。