So che quando si eseguono determinate operazioni in un programma C, i risultati non sono definiti. Tuttavia, il compilatore non dovrebbe generare codice (macchina) non valido, giusto? Sarebbe ragionevole se il codice facesse la cosa sbagliata, o se il codice generasse un segfault o qualcosa del genere ...Codice C con risultati non definiti, il compilatore genera codice non valido (con -O3)
Questo dovrebbe accadere secondo le specifiche del compilatore, o è un bug nel compilatore?
Ecco il programma (semplice) sto usando:
int main() {
char *ptr = 0;
*(ptr) = 0;
}
Sto compilando con -O3
. Ciò non dovrebbe tuttavia generare istruzioni hardware non valide, giusto? Con -O0
, ottengo un segfault quando eseguo il codice. Sembra molto più sano.
Edit: E 'la generazione di un'istruzione ud2
...
UB significa che tutte le scommesse sono state annullate, il buon senso è stato scartato molto tempo fa, nessun motivo per lamentarsi! – Deduplicator
possibile duplicato di [comportamento non definito, non specificato e definito dall'implementazione] (http://stackoverflow.com/questions/2397984/undefined-unspecified-and-implementation-defined-behavior) – Deduplicator
Non sapevo che GCC ha generato un ud2 con comportamento non definito, ma CLang lo fa: http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html –