清除栈帧(C语言)

3

有没有一种聪明的方法能够强制运行时系统在函数返回时清除栈帧?我正在寻找一个编译器标志或某种有趣的黑客。

我们正在尝试创建一个“混沌构建”供学生使用,该构建具有不良行为并向学生暴露更多错误。我知道AddressSanitizer和valgrind可以检测到这些错误,但我真的想能够演示由此类错误代码引起的错误。例如:

int *foo() {
  int a = 10;
  return &a;
}

int bar() {
  int * a = foo();
  printf("%d\n", *a); // I would like to guarantee that this line doesn't print 10
}

2
那段代码无论如何都不会打印出10……它会尝试打印指针a,其值可能为123947120。也许你的意思是printf("%d\n", *a); // A所存储的值 - abelenky
3
通过立即调用另一个定义了一个全0数组的函数进行清洁处理? - Weather Vane
1
我认为你想要做的是把函数调用挂钩到分配并切换到全新的堆栈上。在返回时,您希望释放该堆栈,并将其原先占用的内存标记为不可访问。 - David Schwartz
1
我所说的“清零”是指零。是的,我想要强制未定义的行为来创建错误。单独运行这段代码几乎总是有效的。 - dpzmick
1
@DavidSchwartz 你说得对。有没有在C语言中实现这个的好方法? - dpzmick
显示剩余8条评论
1个回答

1
您可能需要进行中间函数调用,这样可以覆盖来自函数foo的堆栈帧。就像下面的示例一样。在这种情况下,由foo()返回的结果将被覆盖,因此输出不会是10。
5 int *foo()
6 {
7   int a = 10;
8   return &a;
9 }
10
11 int f()
12 {
13     int x = 5;
14
15     return x;
16 }
17
18 int main(int argc, char* argv[])
19 {
20     int * a = foo();
21
22     f();
23
24     printf("%d\n", *a);
25
26     return EXIT_SUCCESS;
27 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接