-Wframe-larger-than
由-Wframe-larger-than
生成警告。 GCC 7 man gcc
說:
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.
小例子
int main(void) {
char s[1024];
return 0;
}
和:
$ 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.
爲什麼這存在
操作系統必須限制ŧ他堆棧大小,否則它會增長,直到它到達堆/ mmap
s,一切都將無法預料地打破。
如果程序試圖增長超過最大堆棧大小,Linux會發送一個信號。
-Wframe-larger-than=
通過保持函數局部變量(放置在堆棧上)很小,有助於防止堆棧溢出。
但是沒有編譯時間保證,因爲在調用遞歸函數時可能會發生問題,而這一切都歸結爲它遞歸的次數。
解決方法是用malloc
分配內存,而不是使用大型數組作爲局部變量。這最終使用mmap
內存。
堆棧和malloc
內存的關鍵區別在於堆棧必須是連續的,這很簡單會導致很大的內存包裝效率,而malloc
需要複雜的啓發式。另請參見:
了哪些功能? – GManNickG 2010-03-15 22:16:58
功能上面是什麼? – niry 2010-03-15 22:21:44
@GMan更新了代碼片段。 @niry另一個功能。 – 2010-03-15 22:35:28