TL;DR: Necesito herramientas para localizar el código problemático en una migración de Linux C++ de 32 a 64 bits (las herramientas pueden estar bajo Linux o Widows).
Así que aquí está, tengo una gran aplicación c++ (estamos hablando de más de 8 millones de líneas de código) que deseo portar de una plataforma de 32 bits a una de 64 bits (en Linux). El motivo de portar el código no es cuestionable, mi tarea es hacerlo. La aplicación es totalmente funcional en 32 bits, pero el código puede ser muy antiguo en algunas partes y claramente no está codificado con estándares y buenas prácticas recientes. Para tener éxito, necesito ubicar todos los fragmentos de código que serán problemáticos cuando se compilen en 64 bits sin detectar demasiados falsos positivos, ya que estamos hablando de millones en líneas y no tengo recursos para refactorizar todo el código para hacerlo limpio y bonito. Así que finalmente mi pregunta es ¿qué herramientas me pueden ayudar en esta tarea?
Consideré PVS-Studio pero parece diseñado para la aplicación de Windows. También consideré usar mensajes de compilación como Gcc y Clang, pero hay demasiados falsos positivos ya que en el caso de 32 bits ya hay muchos. También consideré herramientas de análisis estático como Cppchack, Klowork, Gimpel Pc-Lint y FlexeLint o "Parasoft C++ test", pero realmente no conozco esas herramientas y si realmente pueden ayudarme.
En resumen, los patrones que necesito localizar son (pregúnteme si necesita más detalles):
- uso problemático de tipos con diferentes tamaños en 32 y 64 bits
- desbordamientos inducidos por la migración
- valores mágicos problemáticos
- cambio de estructura de alineación de memoria, union y demás
- mal uso del especificador de formato (como en printf(“%u”, val); si val es largo) - conversión implícita problemática
- métodos y funciones que ya no coinciden (método virtual y sobrecargado)
Los 4 puntos clave son:
- Necesito encontrar todos los problemas inducidos por la migración o saber qué tipos de problemas me perdí si no puedo encontrarlos.
- Necesito tener pocos falsos positivos o una forma de eliminarlos rápidamente (necesito automatización)
- La solución debe ser industrial (es decir, programable o automática). Es una base de código enorme, el trabajo manual no es posible.
- La solución puede ser una herramienta o un conjunto de herramientas, libres o no, Linux o Windows.
Sería una ventaja si la herramienta viene con una documentación agradable y clara.
Si alguna vez ha experimentado este tipo de problema, gracias por cualquier consejo que pueda darme.
Sí, he realizado tareas de análisis y modificación de código a gran escala, incluido C++. Construyo herramientas explícitamente para manejar esto.
Nuestro kit de herramientas de reingeniería de software DMS con su C++ Front End podría ser de ayuda.
(Dado que esta no es una solución lista para usar para el problema de los OP, no puedo hacer una recomendación aquí, solo señalar su existencia. Afirmaré que es una solución viable para su problema como se indica).
Lo que ofrece DMS es la capacidad de configurar una herramienta de análisis personalizada ("guionizada"), centrándose en las necesidades específicas de una base de código particular. Su analizador C++ puede leer código fuente C++14 de estilo GCC o MSVS, crear AST completos, tablas de símbolos con precisión de compilador y control local y análisis de flujo de datos para métodos/funciones. Tiene soporte incorporado para analizar rangos de valores que puede tener una variable. Con estos fundamentos, a menudo es práctico construir un analizador enfocado que detecte problemas específicos de interés.
En la medida en que se detecte un problema y tenga una solución conocida (imagine copiar un puntero de 32 bits en un int de 32 bits; en una máquina de 64 bits, el int de 32 bits debe volver a declararse como 64 bits), DMS puede aplicar fuente Transformaciones de programa a código fuente para modificar los AST y luego regenerar el código fuente a partir de los árboles modificados. Esto puede ser de gran ayuda para administrar el costo del cambio después de la detección. DMS se ha utilizado para otras tareas de cambio masivo aplicadas al código fuente de C++.
Con respecto a los analizadores personalizados necesarios para las tareas de OP:
Ninguno de estos es probablemente tan simple como he sugerido. Es probable que todos ellos juntos supongan mucho menos trabajo que tratar de detectar manualmente/parchar problemas en SLOC de 8M.
Sus puntos clave:
DMS puede ejecutarse en Windows o en Linux bajo Wine.
Ira Baxter
Rbtnk
phuclv