Herramienta que ayuda a la migración de C++ de 32 a 64 bits en una gran base de código

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.

Tendrá que hacer que los usuarios individuales de las diversas herramientas de análisis estático le digan si tienen reglas integradas para detectar su conjunto específico de circunstancias. Algunos podrían; probablemente tendrá un código extraño en su sistema por alguna razón que tales reglas no detectarán, y ahora necesita scriptability. No creo que esas herramientas sean muy programables. Ninguno de ellos te ayudará a corregir el código.
Por ahora no necesito arreglar el código sino solo encontrar los problemas. Sé que no los encontraré a todos y no es un gran problema. Es por eso que tenemos un procedimiento serio de prueba e integración. Pero cuanto más encuentre y menos falsos positivos obtenga, mejor. El objetivo es reducir el número de correcciones para no verse abrumado por el trabajo.

Respuestas (1)

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:

  • diferencias de tamaño de tipo de datos: DMS tiene información de tipo completa para cada entidad declarada y calcula tipos de cada nivel de cada expresión tal como lo hace un compilador de C++. Puede utilizar esta información para detectar discrepancias entre el tipo de un valor de origen (p. ej., puntero [que ahora debe tener 64 bits]) y su destino (p. ej., una ranura de estructura de tamaño declarado de 32 bits).
  • desbordamientos inducidos por la migración: conociendo los tipos/rango de los sumandos, uno puede estimar el rango de la suma, y ​​si el destino puede acomodar una realización de un complemento.
  • valores mágicos problemáticos: si puedes enumerarlos, son fáciles de detectar. Creo que el problema aquí no son los valores, sino el contexto en el que se encuentran. DMS tiene los flujos de datos para encontrar el contexto para que pueda verificarse.
  • cambio de alineación de memoria en estructura, unión y así: DMS tiene la información de tipo. Cuando el tipo "nuevo" debe ser diferente de 32 bits, puede verificar la alineación de los tipos de destino (por ejemplo, ranuras de estructura, etc.)
  • mal uso del especificador de formato (como en printf(“%u”, val); si val es largo): Esto requerirá interpretar el identificador de formato y verificar los argumentos. DMS tiene la información de tipo necesaria
  • conversión implícita problemática: nuevamente, necesita información de tipo para los tipos originales y verificar si la conversión implícita estira/reduce el valor de origen de manera inapropiada
  • métodos y funciones que ya no coinciden (método virtual y sobrecargado): DMS sabe (para la versión válida de 32 bits) cuáles son las coincidencias de sobrecarga adecuadas. Si los operandos cambian de tamaño, se puede hacer una verificación relativamente sencilla para determinar si el tamaño del argumento se declara en consecuencia (o hacer que DMS simplemente cambie el tamaño del operando).

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:

  • Encuentre todos los problemas: puede crear analizadores personalizados para cada problema específico. Algunos serán más fáciles que otros.
  • Minimice los falsos positivos: algunos analizadores personalizados serán huerísticos o algorítmicos según el esfuerzo invertido y la dificultad del análisis. Bienvenido al análisis automatizado de programas y al tarpit de Turing. Tome la ayuda que pueda obtener.
  • Industrial: DMS se ha utilizado para una gran variedad de tareas complejas, en una gran variedad de lenguajes, incluso con C++. Es programable en una variedad de formas; DMS fue diseñado para manejar a gran escala.
  • DMS es un "juego de herramientas"; un conjunto de herramientas y bibliotecas. es comercial Se ejecuta de forma nativa en Windows; ha sido probado minuciosamente bajo Linux/Wine.
  • Documentación: DMS está diseñado para ser utilizado por terceros. Miles de páginas de documentación en línea, diapositivas de tutoriales y ofrecemos una clase de capacitación si lo desea.

DMS puede ejecutarse en Windows o en Linux bajo Wine.