2008-10-03 28 views
22

Se me ha 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).¿Qué herramientas C/C++ pueden verificar para desbordamientos de búfer?

He decidido eliminar primero los desbordamientos de la memoria intermedia. Para facilitar mi búsqueda de errores, ¿qué herramientas se pueden usar para verificar si hay exceso de memoria?

Respuesta

1

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

26

En Linux usaría Valgrind.

+0

Interesante. Veré si esta base de código puede compilarse en Linux una vez que no puedo pensar en otra cosa para arreglar (aunque, lo dudo mucho). Votificado porque a alguien más puede resultarle útil tu respuesta. – MrValdez

+0

Es un poco exagerado solo para el desbordamiento del búfer ... – PierreBdR

+2

El desbordamiento del búfer es un error muy desagradable porque los efectos no son necesariamente cercanos a la causa (es decir, puede fallar 500 líneas más tarde). Si la pila se rompe, necesitarás toda la ayuda para que puedas depurarla. Aquí es donde brilla Valgrind: atrapa el desbordamiento tan pronto como sucede. – diciu

3

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.

Information here

+0

Falta el enlace a la página – crashmstr

+0

Gracias, error en la etiqueta de anclaje. – JaredPar

8

Purificar de IBM hará esto, se ejecuta la aplicación en virtud del mismo y se le dará un informe de todos los errores (incluyendo otros).

Para matar las pérdidas de memoria, utilice UMDH - ejecutar su aplicación, tomar una instantánea de la memoria, ejecute de nuevo, instantánea y luego usar una herramienta de diferencias para ver las asignaciones realizadas desde la primera carrera a través de (tenga en cuenta que debe ejecutar su aplicación una vez, y tome instantáneas lo mejor que pueda).

+0

Es bueno saber que no se ejecuta en Windows 7 x64. – sorin

4

¡Verifique en electric-fence, está diseñado 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 agregando 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.

+3

404 No encontrado en su enlace. – oob

+0

Las fuentes son [aquí] (https://code.google.com/p/electric-fence-win32/). Al parecer, ha sido superado por [DUMA] (http://duma.sourceforge.net/) –

2

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.

+0

Disponible en Windows también –

1

Recomendaría la herramienta gratuita "leakfinder" en el CodeProject de Jochen Kalmbach. Ver mi post para más detalles sobre este tema (y las otras respuestas) en este memory leak question

3

MS:

herramienta
+0

¡Agradable! Pero basado en el tiempo de ejecución. Con una gran base de código * (escrita en C en su caso) * probará principalmente su programa para la forma en que fue diseñado. Un atacante puede necesitar miles de horas para leer el código para encontrar un exploit leakit exploit. Hubiera esperado una herramienta automatizada para el análisis de código fuente similar a la que existe para JavaScript. – user2284570

10

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.

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

+0

Esto no funcionará para C. – user2284570

0

en Windows para pérdidas de memoria/desbordamientos de búfer y otros de detección de errores de tiempo de ejecución puede utilizar:

creo que vale la pena su precio si tiene proyectos grandes que necesitan limpieza.

2

El componente BoundsChecker de Compuware's Devpartner lo hace muy bien en términos de ejecución dinámica. Para pruebas estáticas, recomendaría pc-lint and flex-lint acoplado hasta Riverblade's visual lint para uso y reportes. 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, echa un vistazo a Entrek's code snitch

Otra herramienta para considerar si el código lo hace en el campo es AQtrace, que básicamente analiza los accidentes en las máquinas de los usuarios y la envía detalles. (Por si acaso, todas esas comprobaciones, purificaciones, salpicaduras, valgrinding, etc. perdieron algo)

3

Me sorprende que nadie haya mencionado Application Verifier (free!) 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 desbordamientos 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.

+0

¡Agradable! Pero basado en el tiempo de ejecución. Con una gran base de código * (escrita en C en su caso) * probará principalmente su programa para la forma en que fue diseñado. Un atacante puede necesitar miles de horas para leer el código para encontrar un exploit leakit exploit. Hubiera esperado una herramienta automatizada para el análisis de código fuente similar a la que existe para JavaScript. – user2284570

2

Mi empresa, Semantic Designs está buscando probadores beta para un tiempo de ejecución memory safety checker (incluidos los desbordamientos del búfer) que detectan todos los tipos 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.

Cuestiones relacionadas