编译并运行以下内容:
void main() {
int array[10];
array[10] = 2;
}
这是我的理解堆栈溢出。
GCC似乎没有发现问题。
只有当我使用附加标志-fstack-protector-all
进行编译时,才能获得堆栈跟踪。
有没有办法在没有gcc标志-fstack-protector-all
的情况下检测编译和链接的二进制文件的错误非法内存访问,或者它会正常运行,然后进程会访问不属于它的内存?
答案 0 :(得分:1)
首先,许多现代发行版默认启用-fstack-protector
和其他安全措施(_FORTIFY_SOURCE
,-fPIE
等),这样即使您没有询问,程序也会得到一些保护为了它。
其次,如果不是这种情况并且缓冲区溢出导致真正错误的错误(例如访问无效内存或覆盖返回地址),内核将终止应用程序并转储核心。
更微妙的错误(导致程序出现故障,但不会以明显的方式出现),但不会被检测到。没有例如,没有办法诊断它们。用ASan重新编译。
P.S。请记住,简单的单行缓冲区溢出(如问题中的那个)往往会被编译器优化。我的GCC 5.4.0只是放弃了对array[10]
的访问权限。