見出し画像

C言語 間違い探し

今日出くわしたバグである。
できたてのホヤホヤだ。

#include <stdio.h>
int main()
{
        const static char* name[] =
        {
                "aaa"
                "bbb"
                "ccc"
        };

        printf("%s\n", name[0]);
        printf("%s\n", name[1]);
        printf("%s\n", name[2]);
        return 0;
}

そもそもは不注意なタイピングミスであるが、Visual Studioではコンパイルエラーにならず、実行して例外が発生した。いや、あれは例外なのかな。例外のダイアログも出ずにアプリケーションがぷっつりと終了したのである。一瞬何が起こったのか理解が追い付かなかったが、例外が発生したのだろうと検討をつけてIDEからデバッグ実行してみた。すると来た来た。確かに例外になっている。「どこやねん、ここ」と思うほどライブラリの深いところで停止している。呼び出し履歴で見覚えのあるシンボルまで遡って出くわしたのがこのコードである。正確に全く同じコードではないが(全く同じコードは私が書いたものではあるが著作権は会社にあるので出せない)、問題箇所は含んでいる。これのどこに問題があるのか、すぐわかるだろうか。

間違いに気付いた時にはしばし呆然とした。

このコード、コンパイルエラーにならへんのん?
え? これって言語仕様なん?

30年以上C言語と付き合ってきて、初めて知った次第である。

ちなみに、 clang では警告される。
でもコンパイルは完了し実行もできる。
例外にはならなかった。
例外にならなかったのはたまたまであったかもしれない。


答えはこちら。


この記事が気に入ったらサポートをしてみませんか?