bonotakeの日記

元・ソフトウェア工学系研究者、今・AI系エンジニア

そういえば

2. ローカル変数としてchar buffer[BUFF_SIZE];って宣言して、そのままreturn buffer;として何故いけない? これ、割と問題なしにいったりしますよ(いや、問題ありだけど)。

ええと、解答でも何でもないんですけど。そういえば昔、フリーなプログラマ時代にこんなことがあったのを思い出しまして…

それは、とあるUnixで動いてた科学技術計算のプログラムを、Windowsに移植してくれって依頼だったのです。既に安定して動いてるCのコードがあるから、あとはGUIをつけてくれれば良いと。むしろアルゴリズムをいじられると困るので、オリジナルのソースコードにはIO以外手をつけるなという。納期まで3日程度しかない、簡単ですが急なお仕事でした。

早速Win上でオリジナルのコードをコンパイルして、DOS上で実行。…確かに動いてるっぽい。なーんだあと本当にGUIとつなぐだけじゃん。うは、俺ボロ儲けwww(GUIそのものは別の人間が担当)…とか思っていたんですが。

納期前日、GUI担当からすごい勢いでクレームが。別プロセスで動くGUIつけた途端に、プログラムがばんばん吹っ飛ぶようになったんですよ。

訳がわからず、仕方なく、手をつけるなと言われていたCのソースを見てみることにしたんです。そしたらまぁその、ローカル変数をそのままreturn みたいな操作をありとあらゆる関数でやってたんですね。まさしく、

     ちょwwwwwwwおまwwwwwwwwっうぇうぇwwwwwwwwwwwwwwwww

という状態。安定稼動してるってゆーてたやんけ!

納期まで1日もない状況の中、必死で対策考えまして…そういえばこれ、元々はFortranで書いてあったものの移植だった、とか言う話をそこでふと思い出したんですね。そうか、なるほど…と。
結局、客先や直の発注元とすったもんだした挙句、コードに手を入れざるを得なくなった事に対する始末書と「まことに恐縮ですが状況的に動作を保証できません」という免責の文句付きで、ローカル変数全部staticにしてやりました。 …とてもベストな対応とは言いませんが、一応、動いたみたいです(^^;;;


しかしこのコード、客先ではずーーーっと奇跡的に動いていたんですよね。そう、確かに「これ、割と問題なしにいったり」するんですよ。ある条件下では。


ということで、一連のこの現象を全てちゃんと説明できれば、元の檜山さんの問いにも答えたことになるんじゃないでしょうか!(ならんって? 笑)

注:bonotakeは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。