【发布时间】:2013-10-18 09:54:01
【问题描述】:
我正在尝试让 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必须是二维的)
【问题讨论】:
-
这是 undefined 行为。
-
@MM.:确实。但是 OP 正在询问如何获得工具来检测此类问题(我认为)。
-
@OliCharlesworth 由于数组大小在编译期间是已知的,编译器可能决定只复制第一个
n字节,根本不破坏堆栈。 -
人们,停止使用这种“未定义的行为”标准。这个问题不是关于ISO C++,而是关于
glibc。如果您想挑剔,请询问CPU。这很重要。 -
未定义的行为意味着您所编码的内容并不“对编译器意味着任何有效的东西”。所以它可以用完全没有代码的代码替换有问题的部分,或者退出,或者编译器设计者决定用这样的东西做任何其他事情。换句话说,你不能依赖你的代码来做你写的事情。
标签: c++ c glibc stack-smash