UB come detto prima. Potrebbe funzionare oggi, potrebbe non funzionare domani su un processore / compilatore diverso.
Per alcune divertenti analisi forensi, ecco una cosa divertente da provare (orig in C, anche "lavorata / controllata" nella nostra configurazione C ++ in quel momento), è stato un bug divertente per un po ':
- Definisci una funzione che restituisce un punto fluttuante in un file c o cpp, niente di complesso, solo float / double foo () {qualunque sia il corpo; return someFloat;}.
- Usa la suddetta funzione in un file c o in un file cpp (che assumerà default-int), senza includere il file di intestazione. Nota: a seconda del compilatore, potrebbe essere necessario aggiungere una dichiarazione di tipo errato (int foo ();). Il nostro compilatore al momento pensava che la funzione fosse ok, non aveva il problema dell'identificatore senza un'intestazione inclusa.
- Chiama la seconda funzione (che usa il primo) alcune volte nel codice. Si noti che un valore viene aggiunto ma non è mai saltato fuori lo stack in virgola mobile del processore con ogni chiamata a foo ().
- Lasciati sorprendere dal fatto che NaN inizi a spuntare in operazioni totalmente innocue in seguito. Una volta che lo stack viene overflow (la nona chiamata nel nostro caso), ogni operazione FP diventa un NAN. Quindi ottieni cose divertenti come 10.0 + 1.0 = > NaN.
Il trucco per noi in quel momento era trovare quella funzione offensiva, poiché il NaN si sarebbe verificato molto più tardi, e non sempre nello stesso punto (goditi il multithread su questo).
Se riesci a riprodurlo e disponi di un debugger che ti permette di controllare facilmente lo stato del registro del processore, questo è un bug divertente con cui giocare. A quel tempo il nostro era un sapore di gcc 4.1 (o forse 4.4, non ricordo l'anno esatto), con un processore itanium a 64 bit.
(mi spiace per le mod per le cose extra - non sono sicuro di dove sia, ma è un po 'correlato all'OP, se non ti senti libero di copiare ciò in cui è meglio appartenere).