2011-04-18 9 views
5

¿Hay alguna manera de verificar los desbordamientos de búfer en los VLA? Solía ​​-fstack-protector-all--Wstack protector de pero consigo estas advertencias:¿Controles de límites para arrays de longitud variable (VLA)?

advertencia: no proteger a las variables locales: Tampón de longitud variable

¿Existe una biblioteca para lograr esto? (-lefence es para memoria de montón)

Actualmente estoy usando Valgrind y gdb.

Respuesta

0

Tal vez usar alloca() ayude. Eso es molesto, porque c99 debería evitarle tener que usarlo, pero la página man de GCC parece indicar que el código de protección de la pila se activará si usa alloca().

Por supuesto, la solución real es escribir código perfecto, libre de errores que nunca intente corromper la pila.

0

No veo cómo una biblioteca podría hacer esto por usted; con una matriz de longitud variable, no está llamando a ninguna función para hacer la indexación, por lo que no hay lugar para "enganchar" una biblioteca. Con malloc(), la asignación es explícita en una función y puede rastrearla.

Por supuesto, puede revisar el código y usar el truco del preprocesador para agregar algo de macro a cada punto de indexación y hacer que la macro se expanda al código que verifica los límites. Pero eso es muy intrusivo.

estoy pensando algo así como el cambio:

void work(int n) 
{ 
    int data[n]; /* Our variable-length array. */ 

    data[0] = 0; 
} 

en algo así como:

#include "vla-tracking.h" 

void work(int n) 
{ 
    VLA_NEW(int, data, n); /* Our variable-length array. */ 

    VLA_SET(data, 0, 0); 
} 

luego llegar a las definiciones de macros adecuadas (y el código auxiliar) para realizar un seguimiento de los accesos. Como dije, no será bonito. Por supuesto, la idea es que las macros sean capaces de "compilar" solo las definiciones simples, controladas por alguna configuración de tiempo de compilación (modo de depuración/liberación, o lo que sea).

Cuestiones relacionadas