tutorial solucion seguridad que programacion pila overflows linea desbordamiento camara c++ c buffer-overflow buffer-overrun

solucion - ¿Qué herramientas C/C++ pueden verificar para desbordamientos de búfer?



que es desbordamiento wikipedia (14)

Me han pedido que mantenga una gran base de código C ++ llena de pérdidas de memoria. Mientras hurgaba, descubrí que tenemos muchos desbordamientos de búfer que conducen a fugas (cómo se volvió tan malo, no quiero saber nunca).

Decidí eliminar primero los desbordamientos del búfer. Para facilitar mi búsqueda de errores, ¿qué herramientas se pueden usar para verificar si hay exceso de memoria?


¡Verifique en la cerca eléctrica , es diseño solo para desbordamiento de búfer! No ralentiza el código en sí mismo (pero ralentiza la asignación / desasignación). Funciona y Linux y Windows.

Funciona al agregar un segmento sin acceso de lectura o escritura antes y después de cada espacio asignado. Intentar acceder a esta memoria termina como una falla de segmentación en UNIX y una violación de la memoria (o algo similar) en Windows.


Considere el uso de estructuras de datos más modernas como una forma de evitar los desbordamientos del búfer. Leer en std :: string no se desbordará, y std :: vectores son mucho más seguros que los arrays. No sé cuál es tu aplicación, y es posible que se usen almacenamientos intermedios sin procesar porque necesitas la velocidad, pero es más común que se usen porque eso es lo que los programadores originales se sintieron cómodos.

Es una buena idea buscar fugas de memoria con las herramientas mencionadas, pero es posible que no encuentren todas las posibles fugas, mientras que el uso de cadenas estándar y clases de contenedor puede eliminar problemas que no sabía que tenía.


El componente BoundsChecker del Devpartner de Compuware lo hace muy bien en términos de ejecución dinámica. Para las pruebas estáticas, recomendaría pc-lint y flex-lint acopladas a la fibra óptica de Riverblade para uso y generación de informes. Si te han entregado una nueva base de código, te recomendaría comenzar con un análisis estático con reglas razonablemente flexibles para que captes las cosas desagradables. A medida que mejora la base de código, puedes ajustar el conjunto de reglas.

Si necesita hacer esto en Windows Mobile / Windows CE, revise el snitch de código de Entrek

Otra herramienta para considerar si el código llega al campo es AQtrace , que básicamente analiza los bloqueos en las máquinas de los usuarios y le envía los detalles. (Por si acaso, todo ese control, purificación, deshielo, validación, etc. falta a algo)


El problema con / GS es que en realidad no buscará errores. Simplemente lo alertará después del hecho. Parece que está buscando una herramienta que escanee su código existente para posibles ejecuciones de exceso / defecto de almacenamiento intermedio.

Una buena herramienta para esto y para otros defectos es la herramienta Microsoft PreFAST.

Información aquí


En Linux usaría Valgrind.


En Windows para fugas de memoria / desbordamientos de búfer y otra detección de errores de tiempo de ejecución, puede utilizar:

Creo que valen su precio si tienes proyectos grandes que necesitan limpieza.


Mi voto va a Rational Purify. Extremadamente poderoso con un precio para combinar. Hace poco trabajo de muchos problemas y realmente puede pagar por sí mismo. Además, está disponible en la mayoría * nix. Sin embargo, no estoy seguro acerca de Windows.


Puedes probar Visual Leak Detector : lo usé yo mismo, y es lo primero que recomendaría para la detección de membranas.


Purify de IBM hará esto, ejecutará su aplicación debajo de él y le dará un informe de todos los errores (incluidos otros).

Para eliminar fugas de memoria, use UMDH: ejecute su aplicación, tome una instantánea de la memoria, vuelva a ejecutarla, tome una instantánea y luego use una herramienta diff para ver las asignaciones realizadas desde la primera ejecución (tenga en cuenta que debe ejecutar su aplicación una vez y toma instantáneas lo mejor que puedas).



Visual Studio tiene un indicador de compilador / GS que agrega protección de desbordamiento de búfer. ¿Hay otros?


Me sorprende que nadie haya mencionado Application Verifier (¡gratis!) En Windows. Visual Leak Detector (mencionado en otra respuesta) es absolutamente increíble para rastrear muchos tipos de pérdida de memoria, pero Application Verifier es el mejor para rastrear errores de memoria como desbordamiento de búfer, doble frecuencia y uso de búfer después de libre (más muchos, muchos más).

Editar: Y es muy, muy fácil de usar.


Mi compañía, Semantic Designs, está buscando probadores beta para un comprobador de seguridad de memoria de tiempo de ejecución (incluidos los desbordamientos del búfer) que detecta todo tipo de violaciones de acceso a la memoria, incluso aquellas que valgrind y Purify no pueden. Esto es actualmente solo para programas de Windows C, no para C ++ u otros sistemas operativos.

EDITAR 1 de junio de 2011: la herramienta CheckPointer se ha ido produciendo. Todavía C / Windows solamente. Maneje múltiples dialectos en C: MS Visual C, GCC 3/4.

EDITAR 5 de mayo de 2012: CheckPointer ahora maneja C99, incluida la comprobación de llamadas en las bibliotecas estándar C y C99.


Recomendaría la herramienta gratuita "leakfinder" en el CodeProject de Jochen Kalmbach. Ver mi publicación para más detalles sobre este hilo (y las otras respuestas) en esta pregunta de pérdida de memoria