2010-02-18 10 views
13

¿Hay alguna manera de hacer la comprobación de límites de matriz en C++ compilado utilizando g++?Runtime array límites comprobación en C++ construido con g ++

Lo ideal es que el código fuente no se modifique de ninguna manera. El uso de std::vector, std::tr1::array o boost::array no es una opción porque la base de código es grande y tal cambio sería inviable.

Respuesta

6

Hay una herramienta de Valgrind llamada SGCheck (anteriormente conocida como Ptrcheck) que comprueba el exceso de los límites de la matriz de pila.

valgrind --tool=exp-sgcheck <program> <arguments> 

La herramienta todavía se etiqueta como experimental y viene con varios limitations. Uno de ellos es:

Plataformas: la pila/comprobaciones globales no funcionará correctamente en PowerPC, ARM o s390x plataformas, sólo en los objetivos x86 y AMD64. Esto se debe a que la pila y la verificación global requieren seguimiento de llamadas de función y salidas de manera confiable, y no hay una forma obvia de hacerlo en ABI que usan un enlace para el registro de funciones.

1

GCC mudflap (-fmudflap) puede hacer una comprobación de límites para C, pero no puede manejar todo el código C++ a partir de mediados de 2012 (por ejemplo std::vector). Se eliminó en GCC 4.9 a mediados de 2015, reemplazado por Address Sanitizer. Las opciones de mudplap permanecen, pero no hacen nada.

Existe la MIRO parche - M udflap I mproved con R eferente O bjects. Consulte su homepage para obtener más información. Además, está a paper about it.

He intentado MIRO brevemente. Parece ser muy bueno, pero quizás no funcione con el 100% del código C++. Tengo la intención de utilizar MIRO durante el desarrollo, luego lo apago (y uso el compilador normal) para su lanzamiento. Si está escribiendo su propio código, debería ser bastante fácil hacerlo funcionar con MIRO.

4

Google's AddressSanitizer es un módulo de instrumentación de compilación y una biblioteca de tiempo de ejecución que puede verificar el acceso fuera de límite a montones, montículos y globales, entre otras cosas. Está disponible in Clang 3.1+ y in GCC 4.8+.

Para usarlo, pasar -fsanitize=address (o -faddress-sanitizer en edad Clang 3.1) entre los argumentos para el compilador y el enlazador (a enlaces asan, sin necesidad de -lasan explícita). Para obtener trazas de pila más bonitas en los mensajes de error, pase -fno-omit-frame-pointer al compilador.

Inicialmente se usó para pruebas de cromo, y since 2012, es used by Firefox devs, también. Hay un buen blog post on how to get it running with Qt.También es posible que desee leer más contexto on Wikipedia.