11

C(または同様の言語)で次のコードがあるとしましょう:

if (x < 10)
  do_work1();
else if (x < 5)
  do_work2();

この条件付きの2番目のブランチは、場合によっては実行されますか?コンパイラは到達不能コードについて警告しますか?

4

4 に答える 4

21

Will the second branch of condition be executed in some case?

  • はい、可能かもしれません。コードで他に何が起こっているか、およびコンパイラがコードで何を選択するかによって異なります。

Shouldn't compiler warn about unreachable code?

  • いいえ、到達できないという保証がないため、できません

たとえば、次のようにします。

int x = 11;

void* change_x(){
   while(1)
      x = 3;
}

int main(void) 
{
    pthread_t cxt;
    int y = 0;
    pthread_create(&cxt, NULL, change_x, NULL);
    while(1){
        if(x < 10)
            printf("x is less than ten!\n");
        else if (x < 5){
            printf("x is less than 5!\n");
            exit(1);
        }
        else if(y == 0){    // The check for y is only in here so we don't kill
                            // ourselves reading "x is greater than 10" while waiting
                            // for the race condition
            printf("x is greater than 10!\n");
            y = 1;
        }
        x = 11;
    }

    return 0;
}

そして出力:

mike@linux-4puc:~> ./a.out 
x is greater than 10!
x is less than 5!      <-- Look, we hit the "unreachable code"
于 2012-10-31T13:07:33.167 に答える
4
  • x がローカル変数の場合、do_work2実行できる方法はありません。
  • x がグローバル変数であるか、複数のスレッド間で共有されている場合、do_work2実行できます。

コードが到達可能かどうかを一般的に証明することはできません。コンパイラーには、到達不能コードの単純なケースを検出できる、単純で理解しやすく、迅速にチェックできるルールを含めることができます。時々しか機能しない、遅くて複雑な解決システムを含めるべきではありません。

追加のチェックが必要な場合は、外部ツールを使用してください。

于 2012-10-31T12:32:07.223 に答える
1

いいえ、コンパイラはこのコードに対して警告 (コードに到達できません) を生成しません。この種の警告は、無条件で return を使用すると通常発生します。

お気に入り

int function(){

int x;
return 0;
x=35;
}

この場合、警告が表示されます。

于 2012-10-31T12:34:37.753 に答える
1

2 番目の分岐は実行されず、コンパイラは到達不能コードについて警告しません。

于 2012-10-31T12:31:51.277 に答える