我试图让 glibc 检测堆栈粉碎,我使用以下代码:
#include <stdio.h>
#include <string.h>
static const int n = 5;
int main(int argc, char *argv[])
{
if (argc != 2)
{
printf("usage: %s string\n", argv[0]);
return -1;
}
printf("%s, len = %d\n", argv[1], strlen(argv[1]));
unsigned char a[n][n];
unsigned char * b = a[n - 1];
memcpy(b, argv[1], (strlen(argv[1]) + 1) * sizeof(unsigned char));
return 0;
}
如果 argv[1] 长度大于 5,我希望检测到堆栈粉碎错误,但是,我没有,并且 valgrind 没有检测到任何错误。我应该改变什么来得到这个错误? (数组a必须是二维的)
最佳答案
默认情况下,GCC 仅在您执行诸如 alloca
(或 gets
,正如您在评论中提到的)这样特别危险的事情时添加代码来检测堆栈粉碎,或者声明大型自动阵列。
如果要为所有函数启用保护,请使用-fstack-protector-all
选项。您还可以使用 -Wstack-protector
请求有关未 protected 函数的警告。
关于c++ - 堆叠砸不着火。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19446718/