sábado, 5 de enero de 2013

Locuras en c++ I° parte

    Espero que se me venga a la cabeza algunas que otras locuras, pero esto esto es algo que me llamó un tanto la atención.
    Desconozco cómo funcióna Linux y c++ en cuanto a las violaciónes de memoria.
    Es más que obvio que si declarásemos un vector de 2 elementos, el elemento de la tercer posición no debería de ser accesible ya que podría haber sido reservado para algún programa, o bien ser un cacho de códigos de CS de éste.
    Para ver que pasaba, hice un programa que a continuación se los detallo (un programa más que simple).
  1. Genero un vector de enteros de 2 elementos -> vector[0] y vector[1].
  2. Voy a la posición n (n == 0~10000).
  3. Por cada posición escrita, la pongo en cero y muestro cuál fué.


 Al ejecutar esta cosa me da lo siguiente al final:

  1. ... vector [2536]
  2. ... vector [568]
  3. ... vector [1656]
  4. ... vector [1564]
  5. ... vector [1644]
  6. ... vector [1636]
  7. ... vector [844]
  8. ... vector [2244]
  9. ... vector [1604]
  10. ... vector [2372]
Al final de la ejecución de cada uno, está entonces la excepción : SIGSEGV (11).

De forma clara se puede observar que en ninguna ejecución llega a desplazarse 40000 octetos (10000 * sizeof (int)). Asimismo cada número es par y según mis cálculos, no necesariamente son potencias de 2.

Al parecer, Linux es muy permisivo en cuanto a la asignación de valores en posiciones no reservadas para el programa.

0 comentarios:

Publicar un comentario

Dejanos tu comentario

 
Web Analytics