C'è una discussione in corso su comp.lang.c ++. Moderata sull'opportunità che le asserzioni, che in C ++ esistono solo nelle build di debug per impostazione predefinita, debbano essere mantenute nel codice di produzione o meno.
Ovviamente, ogni progetto è unico, quindi la mia domanda qui non è tanto se le affermazioni debbano essere mantenute, ma in quali casi è consigliabile / non è una buona idea.
Per affermazione, intendo:
- Un controllo di runtime che verifica una condizione che, se falsa, rivela un bug nel software.
- Un meccanismo mediante il quale il programma viene interrotto (forse dopo un lavoro di pulizia davvero minimo).
Non sto necessariamente parlando di C o C ++.
La mia opinione è che se sei il programmatore, ma non possiedi i dati (come nel caso della maggior parte delle applicazioni desktop commerciali), dovresti tenerli attivi, perché un'asserzione fallita mostra un bug e non dovresti andare con un bug, con il rischio di corrompere i dati dell'utente. Questo ti costringe a testare con forza prima della spedizione e rende più visibili i bug, quindi più facili da individuare e correggere.
Qual è la tua opinione / esperienza?
Saluti,
Carl
Vedi la domanda correlata qui
Risposte e aggiornamenti
Ehi Graham,
Un'affermazione è un errore, pura e semplice e quindi dovrebbe essere gestita come una. Dal momento che un errore dovrebbe essere gestito in modalità di rilascio, non hai davvero bisogno di asserzioni.
Ecco perché preferisco la parola "bug" quando parlo di asserzioni. Rende le cose molto più chiare. Per me, la parola "errore" è troppo vaga. Un file mancante è un errore, non un bug, e il programma dovrebbe gestirlo. Cercare di dereferenziare un puntatore nullo è un bug e il programma dovrebbe riconoscere che qualcosa ha un cattivo odore.
Pertanto, è necessario testare il puntatore con un'asserzione, ma la presenza del file con il normale codice di gestione degli errori.
Leggero fuori tema, ma un punto importante nella discussione.
Come avvertimento, se le tue affermazioni si infrangono nel debugger quando falliscono, perché no. Ma ci sono molte ragioni per cui un file potrebbe non esistere completamente al di fuori del controllo del tuo codice: diritti di lettura / scrittura, disco pieno, dispositivo USB scollegato, ecc. Dato che non hai il controllo su di esso, penso che le affermazioni siano non è il modo giusto di affrontarlo.
Carl
Tommaso,
Sì, ho il codice completo e devo dire che non sono assolutamente d'accordo con quel particolare consiglio.
Supponi che l'allocatore di memoria personalizzato si rovini e azzeri un pezzo di memoria ancora utilizzato da qualche altro oggetto. Mi capita di azzerare un puntatore che questo oggetto dereferenzia regolarmente e uno degli invarianti è che questo puntatore non è mai nullo e hai un paio di affermazioni per assicurarti che rimanga tale. Cosa fai se il puntatore è improvvisamente nullo. Hai solo () intorno, sperando che funzioni?
Ricorda, stiamo parlando del codice prodotto qui, quindi non è possibile entrare nel debugger e ispezionare lo stato locale. Questo è un vero bug sul computer dell'utente.
Carl