ESECでPrintMeが大人気

ESECで大人気だった様子のC言語の問題。私は見ていませんがまやさんに教えてもらいました。

、この看板には大体の人が足を止めてみていました。多分分かる人にはすぐ分かるのですが、私の近くにいた若い男性は首をかしげてみていました。

コンパイルエラーを見て「なるほど」でした。皆さんもいかがですか?

そういえば、ESECでこちらの会社の展示をやっていまして何気なくみていました。
私の第一感は「strncpyですか」です

出展者が期待するオチは,「ほらほら,str系のほうに意識が行っちゃって,auto変数をリターンしてしまっていることに気づかないでしょ.人間ってダメよねぇ」って辺りのはず.

問題を教えてもらったときにはすでにアルコールがまわっており、その場で「文字列変数を返していた」といわれたので、まぁ、自分で正解にはたどり着いていません*1。(そう、static変数にすべきだよね)と思った私はRTOSユーザーの風上にも置けない人間です。
この話をしながらふと頭に浮かんだのがかつてある本で読んだ一節

最近の若い人は組み込みの常識を知らないから怖い。初期化済みの大域変数に別の値を上書きしようとする。

それはROMに置かれる変数だから書いちゃだめだよ、ということです。が、(そんな処理系依存の話で若い奴ぶった切らなくても)と思ったのでした。汎用DSP屋の私から見ると大域変数は皆RAMに置かれます。それに、値を変えてほしくなければconstをつけるのが筋でしょとも。
いろんな落とし穴があるんだなぁ、と思いつつ、それもいつかは落とし穴でなくなるのかも、なんて事を考えました。
で、今日の話の落ち

上記のコードをgccコンパイルすると,特にオプションを付けなくても,

PrintMe.c:6: warning: function returns address of local variable

と警告してくれるのであった.この例だけでいうと,そんな高価そうなソフトなど要らない.

いつも「int main()が値を返さねぇぞごるぁ」とgccに怒られるので、この手の警告を禁止できないか考えていた私。

*1:どうでもいいけどC言語って構造体と配列の扱いってギャップが大きいよね