Ver Mensaje Individual
  #33 (permalink)  
Antiguo 15/08/2006, 21:01
Avatar de Instru
Instru
 
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Ahora veremos el mismo tipo de error pero en arreglos dinamicos o punteros.
Primero antes que nada. Hay que aclarar unos conceptos.

-Un arreglo estatico es lo mismo que un puntero con memoria asignada

int p[5];

es igual a

int *p;
p=(int *)malloc(sizeof(int)*5);

-Por consiguiente un puntero puede ser usado como un arreglo

int *p;
p=(int *)malloc(sizeof(int)*5);
p[0]=0;
p[1]=1;

Es totalmente valido

-Igualmente un arreglo puede ser usado como un puntero

int p[5];

*p=0;
p++;
*p=1;

Con estos conceptos aclarados podremos ver que en si el tipo de error es el mismo, solo que mas dificil de depurar:

int *p, val, i;
val=scanf("%d", &val);
p=(int *)malloc(sizeof(int)*val);
for(i=0; i<255; i++)
{
*p=i;
p++;
}

Igualmente, parece un programa inofensivo, pero una vez mas, se esta trabajando con punteros "de manera peligrosa". Estas dejando al usuario elegir el tamaño de la memoria. Si el usuario pone un valor menor a 255 entonces el programa puede compremeter la estabilidad de procesos, el sistema, el programa en si mismo, etc.
Una vez mas, es recomendable no usar los punteros de esta forma peligrosa, al menos que "sepas lo que haces"(cada quien puede usar los punteros como se le de la gana).

Ahora abordando ese tipo de error en arreglos estatico y dinamicos imagina que en vez de un usar un scanf donde pides el valor al usuario, usas otro tipo de procesos. Por ejemplo, haces todo un calculo para calcular la direccion de la varibale:

int funcion(int argumento)
{
//Calculos complejos
return (calculo|(argumeto<<4)^0x80FF);
}
int main()
{
int *p;
p=(int *)malloc(sizeof(int)*0xFFFF);
p[funcion(100)]=1;
}

Mientras la funcion "funcion" regrese un valor menor a 0xFFFF no habra ningun problema, pero si la funcion compleja regresa algun valor fuera del rango 0-0xFFFF(ya sea por algun error en la funcion, etc), entonces estaras usando memoria mas alla del limite. No hay manera "comun" de corregir estos problemas, aqui lo ideal, es revisar la funcion para ver si esta regresando valores dentro del rango, usar un perador AND para filtrar el valor de regreso o una condicion if para saber si el valor devuelto por la funcion es dentro del rango. Todo depende del proyecto.

(Continua)