2012-10-31 3 views
11

Diciamo che abbiamo il seguente codice in C (o linguaggio simile):Se .. Numero altro è più piccolo, irraggiungibile codice

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

Sarà il secondo ramo di questo condizionale essere eseguiti in alcuni casi? Il compilatore avverte del codice irraggiungibile?

+0

No, non verrà eseguito. La maggior parte dei messaggi identificano il codice irraggiungibile. –

+2

Un linguaggio simile potrebbe sovraccaricare '>' e farlo fare la cosa inaspettata. –

+7

Un'altra situazione a cui posso pensare dove viene eseguito il secondo ramo è se 'x' è una variabile globale e hai un altro thread che potrebbe cambiare il valore di' x' che inizialmente era maggiore di 10 a un valore inferiore a 5 dopo il primo test in una sfortunata circostanza. per esempio. 'x' è 11 all'inizio. Thread1 esegue il primo test 'if (x <10)' che è falso e successivamente, Thread2 cambia il valore di 'x' a 4. – halex

risposta

1

Il secondo ramo non verrà eseguito e il compilatore non dovrebbe avvisare del codice irraggiungibile.

+0

'Il secondo ramo non verrà eseguito ', sei sicuro di volerlo dire così incondizionatamente? Quel frammento di codice che OP ha dato non è abbastanza per dire per certo che non verrà eseguito – Mike

4
  • Se x è una variabile locale, quindi non vedo alcun modo che possa essere eseguito do_work2.
  • Se x è una variabile globale o è condivisa tra più thread, è possibile eseguire do_work2.

Non è possibile dimostrare in generale se il codice sia raggiungibile o meno. Il compilatore può avere alcune regole semplici, comprensibili e veloci da verificare in grado di rilevare casi semplici di codice irraggiungibile. Non dovrebbe includere un sistema di risoluzione lento e complesso che solo a volte funziona come.

Se si desidera un controllo supplementare, utilizzare uno strumento esterno.

1

No, il compilatore non genererà alcun avviso (codice non raggiungibile) per questo codice. questo tipo di avvertimento viene normalmente quando si utilizza il ritorno senza alcuna condizione.

come

int function(){ 

int x; 
return 0; 
x=35; 
} 

In questo caso vi darà avvertimento.

+0

Che cos'è "il compilatore"? Molti dei miei compilatori mettono in guardia contro la seconda riga: "il codice non ha alcun effetto"/"codice non raggiungibile". Ma ovviamente non devono avvertire, la definizione stessa di un avvertimento è: qualcosa che è molto probabilmente un errore ma non viola lo standard C. – Lundin

21

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

  • Sì, potrebbe essere possibile, dipende da che cosa sta accadendo nel codice e quello che il compilatore sceglie di fare con il codice.

Shouldn't compiler warn about unreachable code?

  • No, non può perché non c'è garanzia che è irraggiungibile

Prendete questo esempio:

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; 
} 

E l'output:

[email protected]:~> ./a.out 
x is greater than 10! 
x is less than 5!  <-- Look, we hit the "unreachable code" 
+1

+1 per la prova eseguibile :) – halex

+0

@halex - Hai fatto un punto eccellente e meritava di essere esemplificato. E ho avuto qualche minuto libero :) – Mike

+6

Assente qualsiasi attributo 'volatile' (per i compilatori pre-C11) o barriere di memoria, il compilatore non deve preoccuparsi di' printf ("x è minore di 5! \ N") ; 'e ottimizzerà infatti' main() 'nel codice oggetto che non contiene nemmeno l'istruzione, mostrando così quanto ci si preoccupa che l'affermazione sia possibilmente raggiungibile. Il motivo per cui il compilatore non avverte NON è che "non è garantito che non sia raggiungibile", perché non è raggiungibile per esecuzioni definite e il compilatore si preoccupa solo delle esecuzioni definite. –