Domanda

Tony punti su c'è un [Nota] al punto 1.3.12 di C ++ detto di serie

  

tollerati gamme comportamento indefinito dal ignorando completamente la situazione con risultati imprevedibili, a comportarsi durante la traduzione o l'esecuzione del programma in modo caratteristico documentato dell'ambiente ...

non contraddicono questa la definizione di UB dire che ... presente norma internazionale non impone requisiti ? Voglio dire che dire "no requisiti" e poi dicono "UB ammissibile." - proprio nello stesso paragrafo

Come dovrebbe questa nota essere interpretato? Ha infatti limitare UB in qualche modo?

È stato utile?

Soluzione

Da §6.5.1 di parte 3 della norma ISO / IEC direttive:

  

Note ed esempi integrati nel   testo di una norma deve essere utilizzata solo   per dare ulteriori informazioni   lo scopo di aiutare la comprensione   o l'uso di standard e non deve   contengono disposizioni a cui è   necessarie per conformarsi in modo da essere   grado di rivendicare il rispetto del   standard.

Quindi, è del tutto non-normativo (non vincolante) e significava solo per un eventuale chiarimento.

Altri suggerimenti

Come nota non sono normative che non limita in alcun modo UB. E 'solo una precisazione che un'implementazione potrebbe utilizzare alcuni costrutti che formalmente causa UB come estensione documentato, anche se qualsiasi programma che si basa su tale dettaglio a è, ovviamente, di per sé non è in sicurezza portabile su altri ambienti.

Questa nota si spiega che cosa un'implementazione potrebbe fare se incontra il codice per i quali non è definito nessun comportamento. La parola "ammessa" non è destinato ad essere una limitazione, piuttosto sono dati alcuni esempi di comportamenti comuni.

E 'interessante notare che un compilatore ha quasi sempre per compilare qualcosa! Si consideri questo frammento di codice:

void f() { 1 / 0; }

il comportamento del traduttore su incontrando questo non è ben definita, ma non può semplicemente fare qualsiasi cosa gli piace! Infatti se si tratta di un compilatore è ancora richiesto per compilare questa unità di compilazione. Questo perché il comportamento di un programma che contiene questa funzione potrebbe ancora essere ben definito! Il compilatore non può sapere se la funzione viene chiamata. In realtà questa questione è stata sollevata in cui la funzione è "main ()" e controllo era determinata a fluire attraverso la divisione per zero, ed il risultato è che il compilatore non è consentito di respingere anche tale programma. Il motivo è il seguente:. Il programma è ancora ben formato, e un compilatore conforme è obbligato ad accettare tutti i programmi ben formate (e respingere tutti quelli malformati ed emettere un messaggio di errore diagnostico, se non diversamente specificato)

Questo non può essere facilmente fatta mal formata perché è difficile specificare esattamente come compilatori intelligente può essere richiesto di essere in rilevare quando una divisione per zero deve avvenire.

È interessante notare che l'affermazione dello standard che essa "non impone requisiti" è infatti molto vicino ad essere sbagliato. È caratteristiche di un sistema di raccolta che supportano compilazione separata che non è possibile rilevare se un pezzo di codice per cui non c'è ben definito comportamento è, infatti, realizzato, e quindi il compilatore è infatti necessario per qualcosa di compilazione in ogni caso, perché non può dedurre se la programma ha un comportamento non definito.

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