11

假设我们有以下 C(或类似语言)代码:

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

在某些情况下会执行此条件的第二个分支吗?编译器会警告无法访问的代码吗?

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

第二个分支不会被执行,编译器也不应该警告无法访问的代码。

于 2012-10-31T12:31:51.277 回答
1

不,编译器不会为此代码生成任何警告(代码无法访问)。当您在没有任何条件的情况下使用 return 时,这种警告通常会出现。

喜欢

int function(){

int x;
return 0;
x=35;
}

在这种情况下,它会给你警告。

于 2012-10-31T12:34:37.753 回答