2010-07-23 12 views
8

Recientemente he heredado un programa escrito en C++ administrado de un chico que acaba de jubilarse. Después de pasar un tiempo investigando, honestamente puedo decir que al menos el 95% pertenece al thedailywtf. Sin embargo, ahora tengo la tarea de modificarlo y trasladarlo a un idioma con el que me sienta cómodo.¿Hay alguna herramienta de análisis de código que facilitará mi trabajo?

El programa en sí tiene muchos parámetros (más de 50) leídos desde un archivo y realiza una serie de cálculos y arroja un informe. Una vez que termine de abrirme camino a través de páginas de 3 variables de letras (muchas de ellas reutilizadas para propósitos totalmente no relacionados), necesito encontrar una forma de probar mi código para asegurarme de que se obtienen las mismas respuestas que el anterior código.

Esto probablemente sea una ilusión, pero ¿hay alguna herramienta de análisis de código automatizada que pueda ayudarme en esta tarea de cualquier forma?

Lo trasladaré a Java.

Respuesta

2

Creo que debería comenzar a escribir pruebas para asegurarse de que el código portado no rompa el comportamiento del informe existente.

En cuanto a las herramientas automatizadas de análisis de código, las que probablemente le ayuden en esta área son las herramientas de análisis de flujo de datos, que hipotéticamente pueden modelar el flujo de datos desde el archivo a las variables y al informe. Desafortunadamente, la búsqueda de tales herramientas resultó en un fracaso hace unas semanas, para mí. Es posible que desee tener documentos DFD dibujados a mano en algunos lugares, solo para asegurarse de no tropezarse con algo. Graphviz puede ayudar en esta área.

Podría ayudar a copiar la funcionalidad sobre Java (sé que esto suena perverso), pero podría refactorizar el código cuidadosamente bajo la atenta mirada de PMD, FindBugs y herramientas similares de garantía de calidad de código en Java.

EDIT: Había olvidado la parte en la que las herramientas de una categoría determinada podrían ser de ayuda: estas son las herramientas de corte de código en el mundo Java, y debo admitir que no las he usado hasta ahora. Aquí hay una lista que podría ayudar:

+0

triste escuchar su búsqueda salió como un fracaso demasiado –

+0

@yx, es posible que desee comprobar la respuesta actualizada. Tuve que refrescar mi memoria un poco. –

2

necesito para llegar a una forma de probar mi código para asegurarse de que viene con las mismas respuestas como el código anterior.

pruebas unitarias

Ya que menciona que se trata de un programa que toma los parámetros en un archivo y envía un informe, se puede generar un par de entradas que dan cobertura suficiente a las partes que quiere probar la unidad contra el resultado del código anterior.

Si algo se rompe, no olvide que también existe la posibilidad de que haya descubierto un error en el código anterior.

http://www.junit.org/

Puerto progresiva

me gustaría ir para portar pieza por pieza, me siento algo que se ajuste a su problema, ya que en un informe se puede agarrar campos específicos e ignorar los que aún no ha migrado (suponiendo que se genera un campo/cálculo no necesita que se transmita todo el programa) y lo verifique contra el valor correcto del código anterior (u otra fuente correcta en caso de errores en el código anterior) .

+0

sí, estoy al tanto de las pruebas unitarias y haré muchas, esperaba algo además de eso que quizás pueda realizar un análisis lógico del código y determinar si son equivalentes. SÉ que es un hecho que, como todavía no estoy 100% familiarizado con el sistema, existe cierta idiosincrasia esperando a que me muerda el culo. –

+0

No estoy familiarizado con * Managed C++ * (y, por extensión, sus herramientas relacionadas) y creo que lo que querrá analizar es el código anterior para entenderlo y obtener una imagen más completa. En cuanto a la última parte, simplemente use pantalones súper gruesos, casi un requisito para escribir puertos;) – bakkal

+0

no es la protuberancia real que es un dolor en el culo, es la forma en que se escribe el código. Por ejemplo, la mayoría de las comprobaciones de front end + string tienen lugar en un archivo de cabecera de 10000 líneas de largo ... donde él verifica las cadenas carácter por carácter. Su corrector de fecha/hora solo (no usa ninguno de los métodos de la biblioteca, incluso tiene su propia estúpida función atan), tiene unas 200 líneas de longitud. –

0

Descargo de responsabilidad: Nunca he tenido que hacer algo como esto antes.

¿No podría usar primero un convertidor de C++ a Java (una búsqueda rápida en Google me llevó a un producto que afirma ser capaz de hacerlo a un precio muy razonable si de hecho funciona C++ to Java Converter).

A continuación, cree sus pruebas unitarias y comience a refactorizar.

+0

jajajaja, el programa de demostración en el enlace que proporcionó se bloquea alrededor del 20% en el primer archivo .cpp, al menos fue divertido verlo estrellarse: D –

+0

Bueno, supongo que valió la pena :) Todavía podría no ser una mala idea si hay buenos generadores de C++ a Java, quizás alguien más sepa de uno. –

1

me hizo una pregunta algo relacionado Hace algún tiempo que me hace pensar en un posible enfoque: Is there a Findbugs and/or PMD equivalent for C/C++?

Lo que me ocurre es que, si este código es tan janky, tal vez sería una buena idea para pasar un tiempo para intentar repararlo/refactorizarlo en su lugar. Obviamente, si te diriges a Java, es difícil convencerte de dedicar tiempo a mejorar el código C++ que tiene una corta vida útil. Dicho esto, si reemplaza algunas de las porciones obviamente estúpidas con código mejorado, es probable que sea más corto, más estricto, más obviamente correcto y mucho más fácil de transportar y analizar mientras trata de convencerse de que el nuevo código es funcionalmente equivalente al código anterior.

Las herramientas más útiles sugeridas en las respuestas a mi pregunta fueron Splint y Cppcheck.

Había otra cuestión más amplia preguntó hace un tiempo que puede contribuir ideas relacionadas: What open source C++ static analysis tools are available?

Cuestiones relacionadas