0

私は次のように定義された関数を持っています:

int f_2() {
  rand();
  return 10;
}

clangはそれを3つの基本ブロックに分割します。これは理解できます。

ただし、rand()の呼び出しをexit(0)に置き換えると、4つの基本ブロックに分割されます。ウィキペディア(http://en.wikipedia.org/wiki/Basic_block)によると、戻れない関数は基本ブロックの最後にある可能性があります。

clangは、exit()関数が返されないことをどのように認識しますか?clang-cを使用してコードをコンパイルしています。

4

2 に答える 2

1

clangCコンパイラです。標準ライブラリ関数の言語標準による保証を利用することが許可されています。

また、特定の実装には、おそらく言語拡張機能または2011 ISO C標準によって追加されたキーワードを使用して、返されない関数として<stdlib.h>作成されたものがある可能性があります。exit()_Noreturn

この別の例:コンパイラーは関数について知っているので、呼び出しsin(0.0)は、-O1以上で、リテラルにコンパイルされます。(つまり、呼び出すプログラムは、最適化しない場合にのみリンクする必要があります。)0.0sinsin(0.0)-lm

static標準ライブラリ関数と同じ名前で独自の(非)関数を定義するプログラムは未定義の動作をするため、これはすべて許可されます。コンパイラーは、これらの関数に対して標準で指定されている以外のことを呼び出しexitたり、実行したりする可能性を考慮する必要はありません。sin

于 2013-02-05T18:29:59.390 に答える
1

clangかなり賢い獣です。あなたはそれが理解できるものの量に驚かれることでしょう。

このexit関数は標準であり、戻らないことがわかっています。コンパイラはこの事実を利用します。

于 2013-02-05T18:30:40.343 に答える