Pregunta de C

Alvaro Herrera alvherre en commandprompt.com
Jue Mayo 11 10:22:10 CLT 2006


Horst von Brand escribió:
> rodrigo ahumada <rodahummont en yahoo.com.ar> wrote:

> > > int buggy(struct foo *a_foo)
> > > {
> > >     int     tam = a_foo->bar;
> > >     char   *valor[tam];
> > >     int     canario = 0x7e7e7e7e;
> > >     int     i;
> 
> > si gcc crea las variables siguiendo el orden en que se
> > declaran, canario deberia estar por delante de valor:
> > 
> > [i][canario][  valor  ][tam]...
> 
> Crea las variables "hacia abajo" (en el tope) en el stack, cierto.

Trate de ver lo que sucedia si ponia un canario abajo y otro arriba de
la variable, o sea 

int	canario1 = 0x7e7e7e7e;
char   *valor[tam];
int	canario2 = 0xe7e7e7e7;

Sin embargo, me lleve una sorpresa porque mostrando las posiciones de
las variables en el stack, canario1 y canario2 aparecen junto con tam e
i, pegadas al principio del stack, mientras que valor aparece mucho mas
abajo!  Deduzco que el compilador se toma la libertad de reordenar las
variables como le plazca.  Esto es asi tanto con -O0, como -O2 y sin
especificar ninguna.


> > el problema seria que tam fuera tam pero tam grande
> > que al alojar el vector en el stack se alcance a tocar
> > las variables globales... y el problema es que en el
> > codigo en assembly se aloja el vector en el stack asi
> > no mas, sin comprobar cuanto de stack queda... y eso
> > es feo
> 
> Para programas a nivel usuario el stack es inmenso de grande, asi que seria
> muy muy raro que ocurriera eso.

Bueno, el programa de ejemplo se cae con SIGSEGV cuando el "tam" es
mayor que algo de 1900000 (casi 2000000 realmente), lo cual por supuesto
es esperable.  (Esto en x86-64 eso si).

-- 
Alvaro Herrera                                http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.


Más información sobre la lista de distribución Linux