-Wframe-larger-than
La advertencia es generada por -Wframe-larger-than
. man gcc
de GCC 7 dice:
Warn if the size of a function frame is larger than len bytes. The computation done to determine the stack frame size is approximate and not conservative. The actual requirements may be somewhat greater than len even if you do not get a warning. In addition, any space allocated via "alloca", variable-length arrays, or related constructs is not included by the compiler when determining whether or not to issue a warning.
ejemplo Mínimo
int main(void) {
char s[1024];
return 0;
}
y:
$ gcc -std=c99 -O0 -Wframe-larger-than=1 a.c
a.c: In function ‘main’:
a.c:4:1: warning: the frame size of 1040 bytes is larger than 1 bytes [-Wframe-larger-than=]
}
^
$ gcc -std=c99 -O0 -Wframe-larger-than=2048 a.c
# No warning.
Por qué existe este
sistemas operativos deben limitar t El tamaño de la pila, de lo contrario, crecerá hasta que llegue al montón/mmap
y todo se romperá de manera impredecible.
Linux envía una señal si el programa intenta crecer más allá de ese tamaño máximo de pila.
-Wframe-larger-than=
es una forma de ayudar a evitar que la pila se desborde, manteniendo las variables locales de función (que se colocan en la pila) pequeñas.
Sin embargo, no hay garantía de tiempo de compilación, ya que es probable que el problema ocurra al llamar a funciones recursivas, y todo se reduce a la cantidad de veces que se repite.
La solución es asignar memoria con malloc
en lugar de utilizar grandes matrices como variables locales. Esto termina usando la memoria mmap
.
La diferencia clave entre la pila y la memoria malloc
es que la pila debe ser contigua, lo que es simple conduce a una gran eficacia de embalaje de memoria, mientras que malloc
requiere una heurística compleja. Ver también:
Qué hay en la función? – GManNickG
¿Qué hay arriba de la función? – niry
@GMan fragmento de código actualizado. @niry otra función. –