Questo è un bug noto in gcc.
gcc ha una documented extension che permette una dichiarazione della forma
goto *ptr;
dove ptr
può essere qualsiasi espressione di tipo void*
. Come parte di questa estensione, l'applicazione di un unario &&
a un nome di etichetta produce l'indirizzo dell'etichetta, di tipo void*
.
Nel tuo esempio:
int foo = 0;
goto *foo;
foo
è chiaramente di tipo int
, non di tipo void*
. Un valore int
può essere convertito in void*
, ma solo con un cast esplicito (tranne nel caso speciale di una costante puntatore nullo, che non si applica qui).
L'espressione *foo
di per sé è correttamente diagnosticata come errore. E questo:
goto *42;
compila senza errori (il codice macchina generato sembra essere un salto per affrontare 42
, se sto leggendo il codice assembly correttamente).
Un esperimento rapido indica che gcc genera lo stesso codice assembly per
goto *42;
come fa per
goto *(void*)42;
Quest'ultimo è un corretto utilizzo dell'estensione documentata, ed è ciò che si dovrebbe probabilmente se, per qualche ragione, vuoi saltare all'indirizzo 42.
Ho inviato un bug report - che è stato rapidamente chiuso come duplicato di this bug report, presentato nel 2007.
fonte
2016-02-06 03:38:32
È un bug noto. Vedi la mia risposta aggiornata. –