secretbase.log

.NET/C#/Pythonなど

コメント /* NOTREACHED */ の件

NOTREACHED って知っていますか?
下記で紹介されていました。
Super Technique �u���`longjmp�Ɨ��O

ここでコメント /* NOTREACHED */ は、知らない人もいるだろうからちょっと注釈しておこう。gcc では、正確なフロー解析を行い、初期値がセットされていない自動変数を指摘することは皆さんも御承知のことだろう。つまり、プログラムの流れが複雑に分岐していても、それの流れを辿って、すべての場合に変数が正しくセットされるかどうかをチェックしているのである。この時、基本的に関数は戻って来るものとして処理される。呼び出したらそこに戻らずに、どこかに行ってしまう関数は変態であり、そういうライブラリ関数は数少ないが、しかし、そのようなライブラリ関数をラップしたユーザ関数は、任意に作れるからである(warning() なんて良い例だが...)。この時、「ユーザ関数 warning() は戻って来ない」ことをコンパイラに伝えてやれないと、フロー解析では戻って来ることを前提にするので、無意味に「初期値がセットされていない」という警告が発生することがある。だから、コメントのかたちで /* NOTREACHED */ と書いてやると、コンパイラはこのコメントを認識し、このコメントには制御が移らないことを理解する。

下記は、VxWorksというOSのタスク主処理ですが使ってみました。

STATUS tHogeTask(void)
{
    while(1) {
        mainProc();
    }
    /* NOTREACHED */
    /* 返却値は設定必要ない */
}

無限ループの主処理(mainProc)に入ったら出てきません。(もしくはエラーで出てももう一度処理する)
しかしタスクの関数返却値は、 STATUS型ですので値を return する必要があります。
実際には実行されないにもかかわらず、コンパイラでWARNINGになるので以下のコードを入れる必要があります。

    return OK ;

/* NOTREACHED */を使ってみましょう。