Qual è il modo migliore per trovare ampie mal di testa a corda come L “% s”?
-
16-09-2019 - |
Domanda
Ecco un esempio di uno dei mal di testa Voglio dire:
Abbiamo un progetto multipiattaforma che utilizza le stringhe Unicode per lo più per il rendering del testo sullo schermo. Su Windows in VC ++ la riga:
swprintf(swWideDest, LEN, L"%s is a wide string", swSomeWideString);
compila bene e stampa l'ampia stringa nel altra stringa di larghezza. Tuttavia, questo in realtà dovrebbe essere:
swprintf(swWideDest, LEN, L"%ls is a wide string", swSomeWideString);
senza sostituire il '% s' con un 'ls%' questo non funzionerà su altre piattaforme. Come test nel nostro ambiente su Windows è più facile, più veloce e molto più semplice per eseguire il debug. Questo tipo di bug può facilmente passare inosservato.
So che la soluzione migliore è quella di scrivere codice corretto, in primo luogo, ma sotto la pressione semplici errori sono fatti, e in questo caso particolare, l'errore può facilmente passare inosservato per un lungo periodo di tempo.
Ho il sospetto che ci sono molte variazioni su questo tipo di bug, che siamo ancora godere.
Qualcuno ha un modo piacevole e pulito di trovare questo tipo di bug?
: D
Soluzione
Per quanto nessuna delle funzioni della famiglia *printf
sono typesafe si sia
- Ricerca per errori probabili tramite espressioni regolari e fissarli manualmente
- utilizzare un altro approccio che è typesafe, forse sulla base di stringstreams o boost.format
Altri suggerimenti
Si potrebbe desiderare di avere uno sguardo a FastFormat in caso Boost.Format è troppo lento per le vostre esigenze .
Rispetto al stringstreams e Boost.Format:
- iostreams: FastFormat.Format è più veloce di iostreams, tra il ~ 100-900%, in tutti i casi
- Boost.Format: FastFormat.Format è più veloce di Boost.Format, tra il ~ 400-1650%, in tutti i casi