Preparación para la portabilidad a plataformas de 64 bits
por Parasoft
30 de septiembre de 2010
3 min leer
Al encontrar y corregir errores de memoria C / C ++ antes de realizar la migración a 64 bits, puede reducir el riesgo de fallas en la nueva plataforma y arquitectura, optimizar el proceso de transferencia y hacer que la aplicación original sea más sólida y confiable.
Este es un proceso que puede aplicar para preparar su solicitud para el proceso de transferencia de 64 bits:
- Realizar prueba de mutación a través de la detección de errores de memoria en tiempo de ejecución
- Use el análisis estático para identificar código propenso a errores y no portátil
- Repita la detección de errores de memoria en tiempo de ejecución
- Realizar pruebas unitarias (Opcional)
Paso 1: realizar pruebas de mutación mediante la detección de errores de memoria en tiempo de ejecución
Antes de comenzar a realizar la migración, debe eliminar de su código original los problemas que lo acosarán en el procesador de 64 bits; por ejemplo, corrupción de memoria y pérdidas de memoria. Una de las formas más efectivas de exponer los tipos de problemas de punteros y enteros que causarán problemas en los procesadores de 64 bits es aprovechar las pruebas de mutación para la detección de errores de memoria en tiempo de ejecución.
Tecnologías de detección de errores de memoria en tiempo de ejecución como Parasoft Insure ++ le permiten aprovechar las técnicas de las pruebas de mutación tradicionales para descubrir ambigüedades que son difíciles de detectar a través de otros métodos o herramientas. Mientras que las pruebas de mutación tradicionales intentan crear mutantes "defectuosos" para crear un conjunto de pruebas más efectivo, las pruebas de mutación para la detección de errores de memoria en tiempo de ejecución crean y ejecutan lo que deberían ser mutantes funcionalmente equivalentes del código fuente bajo prueba.
Cuando uno de estos mutantes funciona de manera diferente al programa original, indica que la funcionalidad del código se basa en suposiciones implícitas que no siempre se pueden satisfacer durante la ejecución. Si un mutante hace que el programa se bloquee o encuentre otros problemas graves, es una señal de que cuando no se cumplen las suposiciones, se producirán errores graves en el tiempo de ejecución.
En C ++, este proceso de creación y ejecución de mutantes equivalentes puede descubrir:
- Falta de constructores de copias o constructores de copias incorrectos.
- Constructores faltantes o incorrectos.
- Orden incorrecto de inicialización del código.
- Problemas con el funcionamiento de los punteros.
- Dependencia de un comportamiento indefinido como el orden de evaluación.
Paso 2: utilice el análisis estático para identificar código propenso a errores y no portátil
Después de limpiar los errores más críticos expuestos por las pruebas de mutación, use un análisis estático tambiénl para identificar el código que probablemente cause problemas cuando se transfiera a la nueva plataforma/arquitectura. Los analizadores de código estático utilizan una interfaz similar a un compilador para construir un modelo sintáctico y semántico del software. Luego, el modelo sintáctico se analiza contra un conjunto de reglas o "verificadores" para ver si el código está en violación. Estos verificadores usan algoritmos de coincidencia de patrones para detectar errores como el uso deficiente de construcciones de lenguaje, el uso de funciones inseguras y detectan prácticas de codificación deficientes que dificultan la portabilidad y otras violaciones de las pautas de codificación.
Los verificadores más sofisticados emplean análisis semántico que utilizan datos y flujo de control para detectar errores complejos y vulnerabilidades de seguridad. Para hacer esto, el analizador estático construye un modelo de ejecución del software, considera las posibles rutas a través del código y evalúa el uso de los datos a medida que fluyen desde la fuente (por ejemplo, la entrada del usuario) hasta su destino (por ejemplo, una llamada a la API, como una llamada al sistema ). El análisis de cada una de las posibles condiciones y rutas llevaría demasiado tiempo, por lo que el analizador utiliza heurística para detectar las rutas más probables de evaluación. Los tipos de errores detectados por estos verificadores incluyen deferencia de puntero nulo, desbordamientos de búfer y vulnerabilidades de seguridad como comandos e inyecciones de SQL.
Hay dos tareas principales en las que centrarse al realizar un análisis estático:
- Identifique y corrija el código que probablemente resulte en un error en cualquier plataforma o arquitectura.
- Identifique y corrija el código que podría no portarse bien.
Primero, verifique los estándares de codificación C / C ++ respetados por la industria que identifican las construcciones de codificación, que probablemente causen problemas en cualquier plataforma o arquitectura. Al asegurarse de que el código cumpla con estos estándares de codificación, evita errores. Esto se traduce en menos depuración en la nueva plataforma o arquitectura y reduce la posibilidad de tener errores que eluden las pruebas y se abren camino en la versión.
Paso 3: Repita la detección de errores de memoria en tiempo de ejecución
Repita la detección de errores de memoria en tiempo de ejecución para verificar que las modificaciones que realizó al corregir análisis estático las infracciones no introdujeron ningún error de tiempo de ejecución.
Paso 4: realizar pruebas unitarias (opcional)
En este punto, es posible que desee realizar un paso más para asegurarse de que su código esté lo más libre posible de errores antes de portarlo. Este paso adicional es la prueba unitaria. Las pruebas unitarias se usan tradicionalmente para encontrar errores tan pronto como se completa cada unidad de aplicación. También puede ser beneficioso más adelante en el proceso de desarrollo porque, a nivel de unidad, es más fácil diseñar insumos que alcancen todas las funciones. A su vez, esto lo ayuda a encontrar errores más rápido y exponer errores que quizás no descubra con las pruebas a nivel de aplicación.