C(または同様の言語)で次のコードがあるとしましょう:
if (x < 10)
do_work1();
else if (x < 5)
do_work2();
この条件付きの2番目のブランチは、場合によっては実行されますか?コンパイラは到達不能コードについて警告しますか?
C(または同様の言語)で次のコードがあるとしましょう:
if (x < 10)
do_work1();
else if (x < 5)
do_work2();
この条件付きの2番目のブランチは、場合によっては実行されますか?コンパイラは到達不能コードについて警告しますか?
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"
do_work2
実行できる方法はありません。do_work2
実行できます。コードが到達可能かどうかを一般的に証明することはできません。コンパイラーには、到達不能コードの単純なケースを検出できる、単純で理解しやすく、迅速にチェックできるルールを含めることができます。時々しか機能しない、遅くて複雑な解決システムを含めるべきではありません。
追加のチェックが必要な場合は、外部ツールを使用してください。
いいえ、コンパイラはこのコードに対して警告 (コードに到達できません) を生成しません。この種の警告は、無条件で return を使用すると通常発生します。
お気に入り
int function(){
int x;
return 0;
x=35;
}
この場合、警告が表示されます。
2 番目の分岐は実行されず、コンパイラは到達不能コードについて警告しません。