深入探讨C/C++数组、缓冲区溢出保护及相关优化
1. 代码运行异常分析
在Linux环境下运行一段汇编代码时,会出现“Segmentation fault”错误。使用GDB调试时,得到如下信息:
(gdb) r
Starting program: /home/dennis/RE/1
Program received signal SIGSEGV, Segmentation fault.
0x00000016 in ?? ()
(gdb) info registers
eax 0x0 0
ecx 0xd2f96388 -755407992
edx 0x1d 29
ebx 0x26eff4 2551796
esp 0xbffff4b0 0xbffff4b0
ebp 0x15 0x15
esi 0x0 0
edi 0x0 0
eip 0x16 0x16
eflags 0x10202 [ IF RF ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x33 51
(gdb)
这些寄存器的值与win32示例中的有所不同,原因是栈布局也稍有差异。
2. 缓冲区溢出保护方法
为了防止缓冲区溢出这一问题,即使C/C++程序员可能存在疏忽,也有多种保护方法。例如,MSVC提供了以下选项:
- /RTCs
:栈帧运行时检查
- /GZ
:启用栈检查(/RTCs)
其中一种方法是在函数序言部分,在栈