低レベルなヒトの覚え書き

●LSI C-86のエラー

2. 「NULL pointer assignment」(と見せかけて、本当はスタックオーバーフロー)


[個人的な体験談]

エラーの存在に気づいたのは、(これまた)自前のプログラムを改造している最中のことでした。
実際に観察された現象は、プログラムの終了時に必ず「NULL pointer assignment」と表示されるというもの(本来の機能には特に異常なし)。
さっそくメッセージの意味について調べてみると、LSI-Cのマニュアルの記述やネット上の解説記事の内容から、どうやらポインタの操作ミスに関する指摘らしいということがわかりました(ちなみに、このエラーメッセージはLSI-Cに固有のものではなく、C言語の世界では一般的なもののようです)。
実をいうと、問題のプログラムでは、そもそもポインタを一切(少なくとも意識的には)使用していなかったので、そうした指摘はまったく身に覚えのないものだったのですが、エラーなんてだいたいそんなもんだという考えもあって、その辺のことはあまり気にしませんでした。
ともあれ、プログラムの改変がエラーを招いたことは確かなので(と思ったので)、改変した部分を地道に点検していけば、エラーの発生箇所は特定できるだろうと考えました。 ところが、実際に作業を行なってみると、こともあろうに、まだ何も改変していない状態のプログラムでも、問題のエラーになることが発覚。 念のため、以前に同じソースから作成した実行ファイルを持ってきて、まったく同じ条件で実行してみたら、そちらのほうはノーエラーでした。
2つのファイルを比較すると、古いほうは新しいものよりファイルのサイズが小さいという特徴もあって、そのことの意味について考えているうちに、ようやく、前者をコンパイルしたときには、intlibとかtinymain.objをリンクしていたことを思い出しました。 実際に確かめてみると、問題のソースを普通にコンパイルした場合はエラーが発生し、intlibをリンクした場合には、なぜかエラーになりませんでした。
ここまできたところで、筆者にはもう何が何だかわからなくなってしまったので、とりあえず自力での解決はあきらめて、もう一度、ネット上での情報収集をやり直すことにしました。
今回は、より幅広い内容を含んだ解説を探すように心がけて、結果的に行き当たったのが「C FAQ 日本語訳」という文書。 そのなかに収録されていた、問題のエラーメッセージに関する解説の関連項目の関連項目みたいな部分の記述がヒントになって、それでどうにか問題を解決することができました。

→トップ , →ひとつ上(lsic2)


R.2: 2006/08/01
Copyright (C) 2005,2006 A.Satoshi