Un compilatore C++ può emettere codice casuale quando incontra un costrutto classificato come comportamento indefinito?[duplicare]

StackOverflow https://stackoverflow.com/questions/4265167

  •  27-09-2019
  •  | 
  •  

Domanda

Possibile duplicato:
Comportamento non definito, non specificato e definito dall'implementazione

Sto cercando di approfondire la mia comprensione del comportamento indefinito in C++.Supponiamo che un compilatore C++ rilevi intenzionalmente alcuni casi di comportamento indefinito, ad esempio, modificando la variabile due volte tra due punti di sequenza:

x++ = 2;

Una volta che il compilatore immaginario rileva in modo affidabile una situazione del genere, dirà emettere dieci istruzioni macchina totalmente casuali nel codice macchina prodotto.

Secondo lo standard C++, ovunque qualcosa sia classificato come UB non ci sono requisiti su ciò che accade.Il compilatore immaginario descritto sarà conforme allo standard C++?

È stato utile?

Soluzione

SÌ.La norma impone NO requisiti, quindi può fare quello che vuole:

comportamento indefinito

Il comportamento, come potrebbe sorgere in base all'uso di un costrutto di programma errato o di dati errati, per i quali questo standard internazionale non impone requisiti.

Solo come nota, questo è un comportamento indefinito, ma non è necessariamente un buon esempio.Su g++ 4.4.1, rifiuterà di compilare con:

errore:LVALUE richiesto come operando sinistro dell'assegnazione

perché il risultato di un post-incremento non è un lvalue.

Altri suggerimenti

In sostanza sì, se e solo se quelle 10 istruzioni sono ugualmente raggiungibili.Considera il seguente codice:

int main () {
  if (false) {
    int x = 0; x++ = 2;
  }
  std::cout << "Hello, world" << std::endl;
}

L'UB potrebbe essere rilevato in fase di compilazione e la generazione del codice per quel particolare ramo potrebbe risultare in un codice privo di significato.Tuttavia, il salto non così condizionato deve saltare tutto questo e andare dritto oltre la chiusura }

(Questa domanda non è un duplicato perché il rilevamento in fase di compilazione di UB in fase di esecuzione non è stato trattato in precedenza)

Un particolare compilatore (a meno che non sia buggato) avrà sempre lo stesso comportamento (sicuramente nessun codice casuale) quando incontra tali costrutti (a meno che il contesto del codice non sia diverso).

In pratica, "comportamento indefinito" significa "diversi compilatori gestiranno le cose in modo diverso".

Se vuoi sapere "il tuo compilatore immaginario sarà ancora conforme agli standard C ++?" - la risposta penso sia Sì.

Dalla bozza della norma / http://www.kuzbass.ru:8086/docs/isocpp/intro.html / [1.3.12]

[Nota:il comportamento indefinito ammissibile spazia dall'ignorare completamente la situazione con risultati imprevedibili, al comportarsi durante la traduzione o l'esecuzione del programma in modo documentato caratteristico dell'ambiente (con o senza l'emissione di un messaggio diagnostico), al terminare una traduzione o esecuzione (con l'emissione di un messaggio diagnostico) di un messaggio diagnostico).Molti costrutti di programma errati non generano comportamenti indefiniti;devono essere diagnosticati.]

Sicuramente non elenca l'inserimento di istruzioni casuali ed è difficile sostenere che l'aspetto "intervalli da" includa la decisione di inserire istruzioni casuali come se si trovassero in un punto qualsiasi del continuum tra i comportamenti elencati.;-)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top