1. Análisis estático: Esto implica examinar el código * sin * ejecutarlo. Los métodos incluyen:
* Revisión del código: Inspeccionar manualmente el código para errores, inconsistencias de estilo, vulnerabilidades de seguridad y adherencia a los estándares de codificación. Esto a menudo se hace en colaboración.
* Herramientas de análisis de código estático: Herramientas automatizadas que analizan el código para posibles errores, vulnerabilidades y problemas de calidad del código. Los ejemplos incluyen Sonarqube, FindBugs y Lint. Estas herramientas pueden identificar cosas como excepciones de puntero nulo, fugas de memoria y prácticas de codificación inseguros.
* Revisión de diseño: Examinar la arquitectura, los documentos de diseño y las especificaciones del software para identificar posibles problemas al principio del ciclo de vida del desarrollo.
2. Análisis dinámico: Esto implica ejecutar el software y observar su comportamiento. Los métodos incluyen:
* Prueba: Esto es crucial y abarca varias técnicas:
* Prueba unitaria: Prueba de componentes o módulos individuales del software.
* Prueba de integración: Prueba de la interacción entre diferentes componentes.
* Prueba del sistema: Probar todo el sistema en su conjunto.
* Prueba de aceptación: Probar el software para garantizar que cumpla con los requisitos del usuario.
* Prueba de regresión: Vuelva a probar los cambios para garantizar que el nuevo código no haya roto la funcionalidad existente.
* Prueba de rendimiento: Evaluar la velocidad, escalabilidad y estabilidad del software bajo varias cargas. Esto incluye pruebas de carga, pruebas de estrés y pruebas de resistencia.
* Pruebas de seguridad: Identificación de vulnerabilidades que podrían ser explotadas por los atacantes. Esto implica pruebas de penetración, escaneo de vulnerabilidad y auditorías de seguridad.
* Prueba de usabilidad: Observar a los usuarios que interactúan con el software para identificar áreas de mejora en la interfaz de usuario y la experiencia del usuario.
* Depuración: Uso de herramientas de depuración para atravesar el código, inspeccionar variables e identificar la causa raíz de los errores.
* Monitoreo: Observar el comportamiento del software en un entorno de producción para identificar cuellos de botella de rendimiento, errores y otros problemas. Esto a menudo implica la colección de registro y métricas.
* Perfil: Analizar el rendimiento del software para identificar áreas para la optimización.
3. Ingeniería inversa: Esto implica analizar el código compilado o un sistema en ejecución para comprender su funcionalidad, a menudo sin acceso al código fuente. Esto se utiliza para varios fines, incluidos el análisis de seguridad, las pruebas de compatibilidad y la creación de soluciones.
Herramientas y técnicas utilizadas:
* Debuggers (por ejemplo, GDB, LLDB): Para atravesar el código e inspeccionar variables.
* Profilers (por ejemplo, Valgrind, Yourkit): Para identificar cuellos de botella de rendimiento.
* Sistemas de control de versiones (por ejemplo, GIT): Para el seguimiento de los cambios y la colaboración en la revisión del código.
* Los rastreadores de emisión (por ejemplo, Jira, problemas de Github): Para administrar informes de errores y solicitudes de funciones.
* Marcos de prueba automatizados (por ejemplo, Junit, Pytest): Para escribir y ejecutar pruebas automatizadas.
* Herramientas de análisis estático (como se mencionó anteriormente): Para detectar automáticamente los olores de código y posibles insectos.
Los métodos y herramientas específicos utilizados dependen en gran medida del contexto:el tipo de software, la etapa de desarrollo, los recursos disponibles y los objetivos del examen. Un examen integral a menudo implica una combinación de técnicas de análisis estáticos y dinámicos.