可以看到stack有1M,按照正常来说!应该算是没问题了。
[root@test ~]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 127928
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 127928
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
[root@test ~]#
接下来我们来写一个程序,可以看到字符数组a明显大小超过了栈容量大小。
#include <stdio.h>
int main()
{
printf("init ok\n");
char a[1024*1024*1024];
printf("run over\n");
return 0;
}
看看O3优化和未优化 的区别
-O3参数后的汇编代码:
.file "main.c"
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string "init ok"
.LC1:
.string "run over"
.text
.p2align 4,,15
.globl main
.type main, @function
main:
.LFB11:
.cfi_startproc
subq $8, %rsp
.cfi_def_cfa_offset 16
movl $.LC0, %edi
call puts
movl $.LC1, %edi
call puts
xorl %eax, %eax
addq $8, %rsp
.cfi_def_cfa_offset 8
ret
.cfi_endproc
.LFE11:
.size main, .-main
.ident "GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-17)"
.section .note.GNU-stack,"",@progbits
未经过优化的汇编代码:
.file "main.c"
.section .rodata
.LC0:
.string "init ok"
.LC1:
.string "run over"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $1073741824, %rsp
movl $.LC0, %edi
call puts
movl $.LC1, %edi
call puts
movl $0, %eax
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-17)"
.section .note.GNU-stack,"",@progbits
可以看出,未经过优化的代码在超大数组压栈后溢出。
O3后检测出超大数据溢出操作后,自动优化了相关操作。