Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: astinx en 26 Febrero 2012, 19:35 pm



Título: Pregunta sencilla de memoria en C.
Publicado por: astinx en 26 Febrero 2012, 19:35 pm
Hola, estoy tratando de hacer un ejemplo que muestre los segmentation fault, cuando uno aloca memoria para un arreglo y se va mas allá de este. Por ejemplo:
Código
  1. int main(int argc, char** argv)
  2. {
  3. int *vec1 = (int*) malloc (sizeof(int)*3);
  4. int *vec2 = (int*) calloc (3,sizeof(int));
  5. int *vec3 =  NULL;
  6. vec3 = (int*) realloc (vec3, sizeof(int)*3);
  7. int x;
  8. for (x=0; x<5; x++)
  9. {
  10. vec1[x]=x;
  11. }
  12. for (x=0; x<5; x++)
  13. {
  14. *(vec2+x)=x;
  15. }
  16. for (x=0; x<5; x++)
  17. {
  18. *(vec3+x)=x;
  19. }
  20. return 0;
  21. }

Pese a que aloque memoria para solo tres elementos, en cada vector, no me tira segmentetion fault, cuando pisa el 4to o 5to elemento del arreglo, ¿Que significa?, ¿Estoy haciendo algo mal sin darme cuenta?, ¿Aloque memoria de mas sin darme cuenta?


Título: Re: Pregunta sencilla de memoria en C.
Publicado por: El_Java en 26 Febrero 2012, 19:55 pm
No estoy del todo seguro, pero el segmentation fault ocurre cuando el CPU intenta acceder a una zona de memoria físicamente imposible a la que acceder, en el caso de tu código lo que ocurre es un overflow, eso significa que zonas de memoria que no pertencen al array han sido rellenadas con el valor de este array.

puedes verlo en este codigo:
Código
  1. #include <iostream>
  2.  
  3. int main(){
  4.    int arr1[3];
  5.    int arr2[3];
  6.  
  7.    for(int a=0; a<6; a++) arr1[a] = a;
  8.  
  9.    cout << "arr1" << endl;
  10.    for(int a=0; a<3; a++) cout << arr1[a] << endl;
  11.    cout << "arr2" << endl;
  12.    for(int a=0; a<3; a++) cout << arr2[a] << endl;
  13.  
  14.    return 0;
  15. }

Salida:
Código:
arr1
0
1
2
arr2
3
4
5

Espero que te sirva. :D
SALUDOS!


Título: Re: Pregunta sencilla de memoria en C.
Publicado por: Eternal Idol en 26 Febrero 2012, 20:00 pm
La minima unidad de memoria reservada por el procesador es una pagina (http://en.wikipedia.org/wiki/Memory_page) y esta suele ocupar 4096 bytes. Seguramente si te pasas MAS lograras tu objetivo y sino simplemente intenta desreferenciar un puntero nulo ...

El_Java: no, memoria virtual, en S.O. modernos los programas siempre trabajan con memoria virtual.


Título: Re: Pregunta sencilla de memoria en C.
Publicado por: astinx en 26 Febrero 2012, 20:34 pm
Ah perfecto, disculpen, no sabia que era overflow, yo pensaba que pisar mas allá del espacio reservado también era considerado segmentation fault y buscaba que me tirara ese error.

Muchas gracias por responder.


Título: Re: Pregunta sencilla de memoria en C.
Publicado por: Eternal Idol en 26 Febrero 2012, 20:54 pm
Si lo es:

http://en.wikipedia.org/wiki/Segmentation_fault#Common_causes

Proba con x siendo 5000 por ejemplo o sino la mas simple del mundo:

Código
  1. char *p = 0;
  2. *p = 5;


Título: Re: Pregunta sencilla de memoria en C.
Publicado por: astinx en 26 Febrero 2012, 21:01 pm
Gracias ahí lo estoy leyendo.

Dejo este pdf que encontré sobre la implementación de una palabra canario para la protección de overflows, esta bastante interesante.

http://www.google.com.ar/url?sa=t&rct=j&q=canaries%20buffer%20overflows%20c%20example&source=web&cd=8&ved=0CGMQFjAH&url=http%3A%2F%2Fmosfet.isu.edu%2Fclasses%2Fmousavinezhad%2FIEEE%2520eit%25202009%2FPDF%2520files%2FPapers%2F000056.pdf&ei=tYxKT4PNJpOJtweQ_vDvAg&usg=AFQjCNHK51LLUo59NLqogHGck6-s26ekJQ&cad=rja (http://www.google.com.ar/url?sa=t&rct=j&q=canaries%20buffer%20overflows%20c%20example&source=web&cd=8&ved=0CGMQFjAH&url=http%3A%2F%2Fmosfet.isu.edu%2Fclasses%2Fmousavinezhad%2FIEEE%2520eit%25202009%2FPDF%2520files%2FPapers%2F000056.pdf&ei=tYxKT4PNJpOJtweQ_vDvAg&usg=AFQjCNHK51LLUo59NLqogHGck6-s26ekJQ&cad=rja)

Saludos!