2009-07-13 17 views
6

Come si esegue il test per gli errori del compilatore con richiesta in fase di test dell'unità?Test dell'unità per errori del compilatore

Si consideri il codice:

class ErrorTest 
{ 
    OtherClass& read_write() { 
     return other; 
    } 

    const OtherClass& read_only() const { 
     return other; 
    } 

    private: 
     OtherClass other; 
}; 

Come posso provare per read_only) assegnazione (? E 'davvero importante e dovrebbe essere saldamente controllata per generare correttamente gli errori di compilazione:

ErrorTest test; 
OtherClass other = test.read_only(); 
test.read_write() = other.modify(); 
test.read_only() = other.modify(); /* This should error */ 
+0

Buona domanda. Mi sono chiesto lo stesso prima. Non ho mai trovato una buona risposta.Ovviamente potresti scrivere uno script che tenta di compilare il file e verificare il codice di errore o qualcosa del genere, ma non è certo una soluzione elegante. – jalf

risposta

1

Credo che la questione principale ora è, stai testando che il codice o il compilatore a questo punto?

Test del compilatore non è necessariamente una cosa negativa ... Ho avuto aggiornamenti del compilatore in passato, quindi sarebbe bello assicurarsi di ottenere lo stesso set di controlli di sicurezza che ci si aspetta.

Tuttavia, dovrai fare molto lavoro di gambe. Il tuo test unitario dovrà generare il compilatore, catturarne l'output e analizzarlo per la corretta dichiarazione di errore sulla linea corretta. Non è banale, e probabilmente non ne vale la pena.

Un approccio leggermente più semplice potrebbe essere quello di mantenere una directory di codice errato e disporre di uno script per compilare ogni file uno alla volta. Avere un flag "#fdef MAKEFAIL" lì dentro che attiva le condizioni esatte che dovrebbero fallire. Assicurati che il compilatore restituisca 0 quando non imposti quel flag e non zero quando lo fai. Ciò presuppone che il compilatore restituisca un valore diverso da zero in caso di errore ... Non so se MSVC segua questa regola.

Una terza opzione che lancerò lì, per indirizzare la portabilità, è autoconf. Può essere difficile da configurare, ma parte del suo scopo era quello di garantire un ambiente di sviluppo sano prima della compilazione. Potresti aggiungere un test come questo e lasciare gestire il compilatore e provarlo.

+6

Sta testando che il suo codice sia corretto. Quindi penso che stia ancora testando il suo codice, è solo che sta testando le sue proprietà che sono evidenti solo al momento della compilazione. –

+0

L'ho letto mentre sta cercando di assicurarsi che il compilatore stia generando gli avvertimenti, non che non ci siano avvisi. Sembra un po 'ridondante avere un test unitario per dirti che la tua compilation si è lamentata, ma forse se hai un buon parser di test unitari di test ha senso. –

+1

Sta cercando di assicurarsi che il compilatore produca un errore, non un avvertimento. Ci sono molti casi in C++ dove questo ha senso. La correttezza di Const è un esempio, ma se giochi con i modelli, si verifica anche spesso. – jalf

1

Questo sembra un po 'come il rilevamento automatico che si verifica quando "./configure" per una compilazione da sorgente su una macchina * nix. Gli script autoconf creano piccoli programmi e tentano di compilarli per determinare cosa è disponibile e supportato dal compilatore.

Probabilmente non è pratico riutilizzare tutto ciò, ma è possibile che si desideri lo stesso modello. Ogni test avrebbe il proprio file o set di file e un file di progetto separato/make target/etc. Quindi lo script di test tenterà di fare ogni test case e verificare che l'errore previsto si sia verificato, tramite grep o confrontando il output su un output di base memorizzato con i casi di test.

0

Un test valido del compilatore e della piattaforma sarebbe per le variazioni di comportamento di runtime. Lo faccio spesso, riproducendo piccoli bit di comportamenti che esistono nel mio codice di produzione e controllando che il comportamento sia come previsto.

Ma in questo caso ciò che si vuole veramente è uno strumento di analisi statica, che verifica che il codice scritto dagli sviluppatori segua convenzioni come questa. Questo è certamente uno strumento di compilazione valido. Tuttavia, la ricerca di uno strumento di analisi statico per trovare quello che stai specificando qui potrebbe essere difficile. Vorrei iniziare con l'articolo di Wikipedia List of tools for static code analysis, nella sezione C/C++.

Nota che il codice che hai scritto non è un "errore", è semplicemente la tua convenzione. È una convenzione molto buona, ma il compilatore non ti deve e non dovrebbe costringerti a quella convenzione. E nemmeno uno strumento di analisi statica. Quindi dovrai trovarne uno che ti permetta di configurare cosa è permesso e cosa no.

+0

Purtroppo, cppcheck non funziona per questo tipo di errore: "$ cppcheck main.cpp Controllo main.cpp: ... Nessun errore trovato" – LiraNuna

+0

C'è un modo per configurare cppcheck? Non sembra. Questo è quello che devi fare per far rispettare la tua convenzione. –

Problemi correlati