清除 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 }
是否有一些聪明的方法可以强制运行时系统从函数中清除 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 }