c++ - 堆叠砸不着火。为什么?

标签 c++ c glibc stack-smash

我试图让 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/

相关文章:

c++ - std::vector::erase/remove_if 导致 nullptr

c++ - 列出 STL C++ 结构

c - 在循环中使用定义(c 编码)

linux - 从 glibc 源代码生成 libc6-dbg 包

c++ - #include 彼此的两个类出错

c - 如何将 getchar() 输入与 getchar() 中的先前输入进行比较?

c - 商业软件中的内核模块问题

c - 当这些符号是 glibc 的一部分时,链接器会更改这些符号名称

c - 注册打印功能

c++ - 终止使用 QueueUserWorkItem(win 32/nt5) 创建的线程池中长时间运行的线程