清除 return 上的堆栈框架 (C)

Clear stack frame on return (C)

是否有一些聪明的方法可以强制运行时系统从函数中清除 return 上的堆栈帧?我正在寻找编译器标志或某种有趣的技巧。

我们正在尝试为学生创建一个 "chaos build" 将有不良行为并向学生暴露更多错误。我知道 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
}

您可能会执行一个中间函数标注,以便覆盖函数 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 }