2010-10-05 1 views
11

Per motivi di prova, vorrei creare una divisione per zero nel mio codice C++. Ho scritto questo codice:Come causare una divisione intenzionale per zero?

int x = 9; 
cout << "int x=" << x; 
int y = 10/(x-9); 
y += 10; 

Vedo "int = 9" stampato sullo schermo, ma l'applicazione non si arresta in modo anomalo. È a causa di alcune ottimizzazioni del compilatore (mi compilo con gcc)? Quale potrebbe essere la ragione?

+0

Perché non usi 'abort()' invece? Un'altra opzione che non può essere ottimizzata è la scrittura su un puntatore NULL. –

+0

@JanHudec Nel mio caso avevo bisogno di una divisione specifica per zero. Era un codice RT incorporato e volevo riprodurre il comportamento del sistema con uno specifico tipo di errore. Cose come queste si verificano a volte quando si esaminano i bug nei sistemi embedded. – FireAphis

risposta

16

Creare le variabili volatile. Le letture e le scritture su variabili volatili sono considerate osservabili:

volatile x = 1; 
volatile y = 0; 
volatile z = x/y; 
+1

mi è piaciuto .... – cateof

+1

uso intelligente della lingua –

+0

@cateof @John Grazie. :) – GManNickG

14

Poiché non viene utilizzato, si sta ottimizzando.
Prova ad aggiungere un cout << y alla fine.

In alternativa, è possibile disattivare l'ottimizzazione:

gcc -O0 file.cpp 
+2

In alternativa, disattiva l'ottimizzazione :) – Lagerbaer

+0

@Lager Naturalmente :) – NullUserException

+0

Quindi, per chiarire, nella mia binario la linea con la divisione non esiste perché la variabile non è utilizzata? – FireAphis

-1

In genere, una divisione per zero un'eccezione. Se non è gestito, interrompe il programma, ma non si arresta in modo anomalo.

+0

Questa è una vista Microsoft-centrica: la maggior parte degli ambienti non traduce eccezioni della macchina come divide per zero in eccezioni C++ –

+1

Né VC++, IIRC su Windows divide per zero è di default un'eccezione SEH. –

+0

Ha rotto il programma e mi ha dato un'eccezione non gestita quando l'ho compilato. –

2

La divisione per zero è un comportamento non definito. Anche il crash non è praticamente un sottoinsieme appropriato del numero potenzialmente infinito di comportamenti possibili nel dominio del comportamento non definito.