-Wframe-larger-than
Die Warnung wird durch -Wframe-larger-than
erzeugt. man gcc
von GCC 7 sagt:
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.
Minimal Beispiel
int main(void) {
char s[1024];
return 0;
}
und:
$ 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.
Warum diese
Betriebssysteme existiert muss t begrenzen er stapelt die Größe, sonst würde es wachsen, bis es den Heap erreicht/mmap
s und alles würde unvorhersehbar brechen.
Linux sendet ein Signal, wenn das Programm versucht, über die maximale Stapelgröße hinaus zu wachsen.
-Wframe-larger-than=
ist eine Möglichkeit, um das Überlaufen des Stacks zu verhindern, indem die lokalen Variablen der Funktion (die auf dem Stack platziert sind) klein gehalten werden.
Es gibt jedoch keine Kompilierzeit-Garantie, da das Problem wahrscheinlich auftritt, wenn rekursive Funktionen aufgerufen werden, und es kommt darauf an, wie oft es rekursiv ist.
Die Lösung besteht darin, Speicher mit malloc
zu reservieren, anstatt große Arrays als lokale Variablen zu verwenden. Dies endet mit mmap
Speicher. Der Hauptunterschied zwischen dem Stack und dem malloc
Speicher ist, dass der Stack zusammenhängend sein muss, was einfach zu einer großen Speicherpackeffizienz führt, während malloc
komplexe Heuristiken erfordert. Siehe auch:
Was ist in der Funktion? – GManNickG
Was ist über der Funktion? – niry
@GMan aktualisiert Code-Snippet. @niry eine andere Funktion. –