Alvaro Herrera <[EMAIL PROTECTED]> wrote:
> Horst von Brand escribió:
> > rodrigo ahumada <[EMAIL PROTECTED]> 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.
Oh, claro. El arreglo valor[] es especial, porque es de taman~o
variable. Lo mas simple es poner esa clase de leseras al tope (minimiza los
calculos raros que hay que hacer para ubicar variables). O sea, quedaria
algo del corte:
----------
[ canario1 ]
----------
[ *valor1 ]--+
---------- |
+--[ *valor2 ] |
| ---------- |
| [ canario2 ] |
| ---------- |
| [ v ]<-+
| [ a ]
| [ l ]
| [ o ]
| [ r ]
| [ 1 ]
| ----------
+->[ v ]
[ a ]
[ l ]
[ o ]
[ r ]
[ 2 ]
----------
[...]
> > 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).
Aja. Creo que esa es la madre del cordero. 2e6 por 8 bytes son 16MiB, lo
que no es muy prudente andar acarreando en el stack.
--
Dr. Horst H. von Brand User #22616 counter.li.org
Departamento de Informatica Fono: +56 32 654431
Universidad Tecnica Federico Santa Maria +56 32 654239
Casilla 110-V, Valparaiso, Chile Fax: +56 32 797513
From [EMAIL PROTECTED] Thu May 11 17:27:09 2006
From: [EMAIL PROTECTED] (Alvaro Herrera)
Date: Thu May 11 17:27:11 2006
Subject: Pregunta de C
In-Reply-To: <[EMAIL PROTECTED]>
References: <[EMAIL PROTECTED]>
<[EMAIL PROTECTED]>
Message-ID: <[EMAIL PROTECTED]>
Horst von Brand escribió:
> > 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).
>
> Aja. Creo que esa es la madre del cordero. 2e6 por 8 bytes son 16MiB, lo
> que no es muy prudente andar acarreando en el stack.
Cierto. Pero en el ejemplo real, el arreglo es de 1600 elementos de 4
bytes c/u como maximo. (Tipicamente sera de menos de 100 elementos).
Ahora, he seguido investigando mas en el ejemplo real y ya me convenci
que el problema no es este. Hay otra cosa que por algun motivo esta
sobreescribiendo la memoria, pero todavia no se que es.
--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support
From [EMAIL PROTECTED] Thu May 11 17:43:13 2006
From: [EMAIL PROTECTED] (Horst von Brand)
Date: Thu May 11 17:43:17 2006
Subject: Acerca de QT
In-Reply-To: Your message of "Thu, 11 May 2006 08:32:45 CST."
<[EMAIL PROTECTED]>
Message-ID: <[EMAIL PROTECTED]>
""Manuel R. Bercián"" <[EMAIL PROTECTED]> wrote:
> Perdonen la pregunta yo se que es una lista Linux pero como es QT,
> quiza ustedes saben,
> tengo un programa en QT, en Windows como puedo hacer para levantar
> aplicaciones
> instaladas ahi, por ejemplo, word, excel, el internet explorer, etc,
Gracias
Ni idea. Pregunta en una lista sobre QT o sobre Windows.
--
Dr. Horst H. von Brand User #22616 counter.li.org
Departamento de Informatica Fono: +56 32 654431
Universidad Tecnica Federico Santa Maria +56 32 654239
Casilla 110-V, Valparaiso, Chile Fax: +56 32 797513