2010-07-23 23 views
8

Ho recentemente ereditato un programma scritto in Managed C++ da un ragazzo che è appena andato in pensione. Dopo aver trascorso un po 'di tempo a scavare attraverso di esso, posso dire onestamente che almeno il 95% di esso appartiene a thedailywtf. Tuttavia, ora ho il compito di modificarlo e portarlo su una lingua con cui mi trovo a mio agio.Esistono strumenti di analisi del codice che semplificheranno il mio lavoro?

Il programma stesso accetta molti parametri (50+) letti da un file ed esegue una serie di calcoli e sputa un rapporto. Una volta che ho finito di scorrere le pagine di 3 lettere (molte di esse riutilizzate per scopi totalmente non correlati), ho bisogno di trovare un modo per testare il mio codice per assicurarmi che abbia le stesse risposte del precedente codice.

Questo è molto probabilmente un pio desiderio, ma ci sono strumenti di analisi automatica del codice che possono aiutarmi in questo compito in qualsiasi modo o forma?

Lo porterò su Java.

risposta

2

Penso che dovresti iniziare a scrivere test per assicurarti che il codice non interrompa il comportamento del rapporto esistente.

Per quanto riguarda gli strumenti di analisi automatica del codice, quelli più utili per aiutarvi in ​​quest'area sono gli strumenti di analisi del flusso di dati, che possono modellare in modo ipotetico il flusso di dati dal file nelle variabili e nel report. Sfortunatamente, la ricerca di tali strumenti ha comportato un fallimento qualche settimana fa, per me. Potresti voler avere DFD disegnati a mano in alcuni punti, solo per assicurarti di non inciampare su qualcosa. Graphviz può aiutare in questo settore.

Potrebbe aiutare a copiare le funzionalità su Java (so che questo sembra perverso), ma è possibile rifattorizzare il codice con attenzione sotto gli occhi attenti di PMD, FindBugs e strumenti analoghi di controllo qualità in Java.

EDIT: avevo dimenticato la parte in cui in strumenti di una certa categoria potrebbe essere di aiuto - questi sono gli strumenti del codice affettatrici del mondo Java, e devo ammettere che io non li ho utilizzato finora. Ecco un elenco che potrebbe aiutare:

+0

triste sentire la vostra ricerca è venuto fuori come un fallimento troppo –

+0

@yx, si potrebbe voler controllare la risposta aggiornata. Ho dovuto fare un po 'di jogging nella mia memoria. –

2

Ho bisogno di trovare un modo per testare il mio codice per assicurarsi che si tratta con le stesse risposte come il codice precedente.

test Unità

Dal momento che lei ha detto che si tratta di un programma che prende i parametri in un file ed emette un rapporto, si potrebbe generare un paio di ingressi che danno una sufficiente copertura alle porzioni voi desidera test dell'unità contro l'uscita dal vecchio codice.

Se qualcosa si rompe non dimenticare che c'è anche la possibilità di aver scoperto un errore nel vecchio codice.

http://www.junit.org/

Progressive Port

mi piacerebbe andare per il porting pezzo per pezzo, mi tipo di sentire che si adatta al vostro problema dal momento che in un rapporto si può afferrare campi specifici e ignorare quelli che non hai ancora effettuato il porting (supponendo di emettere un campo/calcolo non hai bisogno di portare tutto il programma) e verificarlo rispetto al valore corretto dal vecchio codice (o altra fonte corretta in caso di bug nel vecchio codice) .

+0

sì, sono a conoscenza dei test unitari e ne farò molti, speravo in qualcosa in aggiunta a quello che forse è possibile eseguire un'analisi logica del codice e determinare se sono equivalenti. So per certo che siccome non conosco ancora al 100% il sistema, c'è dell'idiosincrasia che aspetta solo di mordermi nel culo. –

+0

Non ho familiarità con * Managed C++ * (e per estensione i relativi strumenti) e penso che quello che vorrete analizzare è il vecchio codice per capirlo e ottenere l'immagine più grande. Per quanto riguarda l'ultima parte, indossa solo pantaloni molto spessi, quasi un requisito per scrivere le porte;) – bakkal

+0

non è la protezione effettiva che è un rompiscatole, è il modo in cui il codice è scritto. Ad esempio, la maggior parte del front-end + controllo delle stringhe si svolge in un file di intestazione lungo 10000 righe ... dove controlla le stringhe carattere per carattere. Solo il suo controllore di data/ora (non usa nessuno dei metodi di libreria, ha persino la sua stupida funzione), è lungo circa 200 righe. –

0

Disclaimer: Non ho mai dovuto fare nulla di simile prima.

Non si può usare prima un convertitore da C++ a Java (una ricerca rapida su google mi ha portato a un prodotto che afferma di poterlo fare a un prezzo molto ragionevole se effettivamente funziona C++ to Java Converter).

Quindi, creare i test dell'unità e iniziare il refactoring.

+0

hahahaha, il programma dimostrativo nel link che hai fornito si blocca circa il 20% del primo file .cpp, almeno è stato divertente guardarlo in crash: D –

+0

Oh beh, immagino valga la pena sparare :) Potrebbe non essere una cattiva idea se ci sono dei buoni generatori di C++ in Java, forse qualcun altro ne conosce uno. –

1

ho fatto una domanda in qualche modo correlato qualche tempo fa che mi fa pensare a un possibile approccio: Is there a Findbugs and/or PMD equivalent for C/C++?

Quello che viene in mente è che, se questo codice è così janky, forse sarebbe una buona idea per trascorrere un po 'di tempo per provare a riparare/refactoring sul posto. Ovviamente, se sei diretto a Java, è difficile convincerti a dedicare del tempo a migliorare il codice C++ che ha una vita breve. Detto questo, se si sostituiscono alcune delle parti ovviamente stupide con codice migliorato, sarà probabilmente più breve, più stretto, più ovviamente corretto e molto più facile da eseguire e analizzare mentre si tenta di convincersi che il nuovo codice è funzionalmente equivalente al vecchio codice.

Gli strumenti più utili suggeriti nelle risposte alla mia domanda erano Splint e Cppcheck.

c'era un'altra questione più ampia chiesto qualche tempo fa, che possono contribuire idee correlate: What open source C++ static analysis tools are available?

Problemi correlati