Domanda

Può questo mai accadere? 3 afferma, in cui si dovrebbe attivare.

int nr = perform_calc();
assert( nr == 0);
assert( nr > 0);
assert( nr < 0);

Ci può essere un caso in cui il programma non attiva il asserisce il g ++ 3.4.4.

E no io non ho la possibilità di modificare il codice per stampare il numero nel caso in cui il asserisce non attivano.

Tutte le idee?

Edit: Dopo aver letto diversi commenti sono stato costretto a modificare. Mostra il codice? perché stai facendo questa cosa stupida? Io non ci credo! Dove si usa? Dalla mia domanda avrebbe dovuto essere ovvio che non voglio postare / modificare il codice a causa di diverse ragioni possibili:

  • Sono un principiante totale e si vergogna del codice (nessun crimine lì, sicuro che fa rispondere alla domanda molto più facile se ho posto esso)
  • Mi è stato chiesto di aiutare un amico con solo poche informazioni (e no, non gli ho chiesto perché non si può controllare il numero restituito, o Perché non può solo aggiungere un punto di interruzione).
  • Sto scrivendo il mio codice in emacs senza alcun compilatore e trasmette il testo a un server remoto che lo compila, lo esegue e solo possono tornare fallito afferma se qualcosa va storto.

Se avete creduto che stavo facendo uno scherzo o di una bufala si dovrebbe avere votato per una chiusura del thread, invece. Mi sarebbe stato perfettamente bene con quello. Ma l'aggiunta di commenti inutili come questo solo fatto venire voglia una bandiera "atteggiamento" da attuare.

Voglio ringraziare gli altri per i loro commenti e le risposte che in realtà hanno cercato di spiegare e risposto alla mia domanda.

È stato utile?

Soluzione

Per quanto ho visto cose così brutte nella mia vita, potrebbe essere spiegato se perform_calc () ha un sovraccarico del buffer che sovrascrive l'indirizzo di ritorno nello stack. Quando la funzione termina, l'indirizzo sovrascritto viene recuperato dalla pila e impostato sul PC corrente, che porta a un salto forse in un'altra zona del programma, a quanto pare oltre le chiamate asserzioni.

Anche se questa è una possibilità molto remota, quindi è quello che si sta mostrando.

Un'altra possibilità è che qualcuno ha fatto un trucco macro brutto. controllare se si dispone le cose come

#define assert 

o qualche collega ha messo qualcosa di simile in un colpo di testa mentre eri al bagno

#define < ==
#define > ==

Come suggerito in un'altra risposta, verificare con -E gcc per vedere che cosa è in realtà il codice compilato.

Altri suggerimenti

assert non è selezionata se il NDEBUG macro viene definita. Assicurati di #undef NDEBUG Nella compilazione di questa unità di traduzione.

È possibile richiamare gcc con l'interruttore -E per verificare che le istruzioni Assert sono ancora nel codice.

E non sembra che il codice è corretto, in primo luogo. Se il debug è acceso (DEBUG e / o _DEBUG vengono impostati e NDEBUG è disinserito):

assert( nr == 0);

La linea di cui sopra chiamerà exit () se n = 0. Pertanto, se questa linea passa, la seconda asserzione eseguirà:

assert( nr > 0);

... e uscire call () perché nr == 0 e! (Nr> 0).

assert( nr < 0);

E questa terza riga non verrà mai eseguito a tutti.

Quello che, appunto, è il punto di questo codice? E perché, se questi si potrebbero aggiungere afferma, potrebbe non invece aggiungere un printf ()?

E 'questo codice multithreaded? Forse hai un race condition .

  

E no non ho la possibilità di   modificare il codice in modo da stampare il   numero out ..

Strano. È, ovviamente, ha la possibilità di inserire le dichiarazioni assert (), perché se fossero realmente nel codice vero e proprio non si poteva toccare, il codice non poteva funzionare. Allora perché non si può stampare il valore del assert () chiamate di prova?

Ho il sospetto che hai accidentalmente eliminato il problema, mentre sanificazione il frammento di codice. C'è sia più codice (e NR è sempre cambiato tra afferma), o in realtà non quella faccia (o, per rlbond, non si dispone di assert acceso).

prova a pubblicare un segmento di codice meno sterilizzata, e vediamo se non siamo in grado di lavorare fuori.

Potrebbe essere un NaN ? In tal caso, la seguente asserzione fallirebbe:

assert( nr == nr );
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top