Usa ASSERT Standard/Q_ASSERT, ma attenzione delle affermazioni "non valido", specialmente se si lascia tale diagnostica in test esterni (build senza NDEBUG).
Piccola storia riguardante l'implementazione DBC (utilizzando asserzioni) in un progetto C++ e una politica di "debugging sempre abilitato".
Stavamo usando strumenti piuttosto standard (ASSERT()/Q_ASSERT()) come implementazione DBC fino a quando abbiamo raggiunto la seguente situazione in fase di test di integrazione: la nostra ultima build era sempre fallendo subito dopo iniziare. Non è stato molto professionale rilasciare tale versione (dopo una settimana di sforzi interni di controllo qualità).
Come è stato introdotto il problema?
- Uno sviluppatore sinistra affermazione sbagliata (espressione logica non valida) nel codice sorgente
- Tutto il nostro pre-release build avevano affermazioni hanno permesso (per tenere traccia errori nei test di integrazione)
- QA interno ha diverse impostazioni dell'ambiente rispetto ai test di integrazione, quindi "errore di asserzione" non era visibile
Come risultato cacca r lo sviluppatore è stato accusato di errore (ovviamente senza questo ASSERT non ci sarebbe stato alcun arresto anomalo) e abbiamo dovuto rilasciare l'hotfix per consentire il proseguimento dei test di integrazione.
Prima di tutto: ho bisogno affermazioni abilitati nel test di integrazione per monitorare le condizioni falliti (i più asserzioni e meglio), d'altra parte non voglio sviluppatori di abbiate paura che alcuni ASSERT "extra" arresteranno lo stack completo del software.
Ho trovato, probabilmente una soluzione interessante basata su C++ per questo problema: asserzioni deboli. L'idea è di non interrompere l'intera applicazione in caso di asserzione fallita, ma di registrare lo stacktrace per analisi successive e continuare. Possiamo verificare tutte le aspettative che vogliamo senza paura di crash e riceviamo feedback (stacktraces) dall'integrazione. L'esecuzione di un singolo processo può fornire molti casi di asserzione falliti per l'analisi invece di uno solo (perché non c'è abort() chiamato).
L'attuazione di questa idea (usando qualche magia LD_PRELOAD) viene brevemente descritto qui: http://blog.aplikacja.info/2011/10/assert-to-abort-or-not-to-abort-thats-the-question/
fonte
2012-09-23 20:39:15
È necessario chiarire cosa ti rende insoddisfatto dei meccanismi semplici con la macro assert (in minuscolo). –
Vedi anche http://stackoverflow.com/questions/179723/questo-è-il-best-way-of-implementing-assertion-checking-in-c –
Ti sei appena collegato a una libreria che fa esattamente quello che sei chiedere. Cosa ti aspetti che diciamo? "Potresti dare http://www.codeproject.com/KB/cpp/DesignByContract.aspx un colpo"? Se si desidera qualcosa di più di quello che offre la libreria, non utilizzarla come esempio di ciò che si sta cercando. Dicci cosa vuoi che non fornisca. – jalf