During a make, I\'m seeing an error along the lines of:
cc1: warnings being treated as errors
somefile.c:200: error: the frame size of 1032 bytes is larger than
-Wframe-larger-than
The warning is generated by -Wframe-larger-than
. man gcc
of GCC 7 says:
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 example
main.c
int main(void) {
char s[1024];
return 0;
}
and:
$ gcc -std=c99 -O0 -Wframe-larger-than=1 main.c
main.c: In function ‘main’:
main.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 main.c
# No warning.
Why this exists
Operating systems must limit the stack size, otherwise it would grow until it reaches the heap / mmap
s and everything would break unpredictably.
Linux sends a signal if the program tries to grow beyond that maximum stack size.
-Wframe-larger-than=
is a way to help to prevent the stack from overflowing, by keeping function local variables (which are placed on the stack) small.
There is no compile time guarantee however, since the problem is likely to happen when calling recursive functions, and it all comes down to how many times it recurses.
The solution is to allocate memory with malloc
instead of using large arrays as local variables. This ends up using mmap
memory.
The key difference between the stack and malloc
memory is that the stack must be contiguous, which is simple leads to great memory packing efficiency, while malloc
requires complex heuristics. See also: