elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Pregunta sencilla de memoria en C.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Pregunta sencilla de memoria en C.  (Leído 2,779 veces)
astinx

Desconectado Desconectado

Mensajes: 111



Ver Perfil
Pregunta sencilla de memoria en C.
« 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?


En línea

La programación hoy en día es una carrera entre los ingenieros de software intentando construir mejores y más eficientes programas a prueba de idiotas y el Universo intentando producir mejores y más grandes idiotas. De momento, el Universo está ganando
El_Java

Desconectado Desconectado

Mensajes: 144



Ver Perfil WWW
Re: Pregunta sencilla de memoria en C.
« Respuesta #1 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!


En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Pregunta sencilla de memoria en C.
« Respuesta #2 en: 26 Febrero 2012, 20:00 pm »

La minima unidad de memoria reservada por el procesador es una pagina 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.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
astinx

Desconectado Desconectado

Mensajes: 111



Ver Perfil
Re: Pregunta sencilla de memoria en C.
« Respuesta #3 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.
En línea

La programación hoy en día es una carrera entre los ingenieros de software intentando construir mejores y más eficientes programas a prueba de idiotas y el Universo intentando producir mejores y más grandes idiotas. De momento, el Universo está ganando
Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Pregunta sencilla de memoria en C.
« Respuesta #4 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;
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
astinx

Desconectado Desconectado

Mensajes: 111



Ver Perfil
Re: Pregunta sencilla de memoria en C.
« Respuesta #5 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

Saludos!
En línea

La programación hoy en día es una carrera entre los ingenieros de software intentando construir mejores y más eficientes programas a prueba de idiotas y el Universo intentando producir mejores y más grandes idiotas. De momento, el Universo está ganando
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda !! Pregunta sencilla
Ingeniería Inversa
arnie 1 2,115 Último mensaje 19 Febrero 2004, 22:46 pm
por byebye
Pregunta sencilla, vb
Programación Visual Basic
Alchemist 5 2,443 Último mensaje 5 Noviembre 2005, 12:05 pm
por Syphroot
pregunta muy sencilla
Programación Visual Basic
dark_soul 2 1,990 Último mensaje 12 Noviembre 2005, 15:38 pm
por dark_soul
Una sencilla pregunta sobre Photoshop
Diseño Gráfico
Dark Shadow 3 2,878 Último mensaje 9 Enero 2006, 02:23 am
por + enrique ZP
Pregunta sencilla sobre Working Set
GNU/Linux
astinx 0 2,863 Último mensaje 1 Marzo 2012, 20:54 pm
por astinx
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines