返回时清除堆栈帧(C)

时间:2015-12-22 18:26:20

标签: c clang

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

我们正在努力为那些行为不良并向学生暴露更多错误的学生创建一个“混乱构建”。我知道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
}

1 个答案:

答案 0 :(得分: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 }