2009-09-04 14 views
5

Mi piacerebbe avere una implementazione portatile della mia applicazione. Tuttavia, Ho sentito che ci sono alcuni problemi con printf dallo stdlib su alcune macchine dove non si comporta come previsto. Ad esempio, quando si utilizza lo specificatore di conversione % f, può succedere che su alcune architetture l'implementazione di printf includa un punto decimale nell'output!Test dell'implementazione printf

Ora mi chiedo, se ci sono forse alcune routine di test là fuori che ho potuto utilizzare per verificare la correttezza semantica di esecuzione stdlib c, in particolare la printf routine. Forse ci sono alcune buone risorse che evidenziano alcuni problemi durante il porting dei programmi?

Molte grazie, Heinz

+0

Cosa c'è di sbagliato con il punto decimale nel risultato? IMO è più correlato a l10n che alla portabilità. –

+0

Quando lo si utilizza per il test, si ottengono in genere diversi output su piattaforme diverse; questo potrebbe significare che un test potrebbe fallire a causa del punto decimale che porta a una diversa rappresentazione sebbene i valori stessi siano gli stessi. –

+3

@ Heinz, è possibile impostare le impostazioni locali su "C" nel codice di test (ad esempio setlocale (LC_NUMERICAL, "C")). Questo dovrebbe produrre sempre un punto decimale e non una virgola o qualcos'altro. – quinmars

risposta

1

si dovrebbe scrivere il proprio suite di test che copre le questioni che vi riguardano. È molto semplice chiamare printf 100 volte con vari input, e l'output è un testo semplice, quindi è semplice controllare l'output che ci si aspetta.

4

Penso che Postel's law ("sii prudente in ciò che fai, sii liberale in ciò che accetti agli altri") si applica anche qui. Non scrivere i test per richiedere una corrispondenza carattere per carattere al fine di considerare l'implementazione printf() funzionante.

Invece, farlo a un livello superiore; analizzare il testo in uscita con printf() nel tipo di dati previsto e confrontarlo con un valore di quel tipo.

I.e., se si stampa "2,25", analizzare il testo (utilizzando strtod() o equivalente) e confrontarlo con il numero effettivo 2.25, non con la stringa di testo letterale "2.25".

0

Si consiglia di testarlo nel modo seguente: utilizzare sprintf() per produrre alcuni modelli di test e confrontarli con quello "corretto".

Ho fatto qualcosa di simile usando fprintf (solo per evitare la memorizzazione nella cache nel nostro sistema embedded).

Penso che i risultati non differirebbero per printf e sprintf: l'algoritmo di formattazione è lo stesso.

+0

Gli algoritmi sono gli stessi perché nella maggior parte dei casi tutta la famiglia printf utilizza un'implementazione comune. Confrontare un membro della famiglia con un altro confermerà solo che hanno ottenuto la stessa risposta, ma non aiutano a decidere se è la risposta giusta. – RBerteig