首页 > 解决方案 > 分配给本地堆栈变量的堆栈偏移量是否曾经被重用过,例如,以防它失效或超出范围?

问题描述

换句话说,编译器是否会在程序堆栈中分配足够的空间来存储当前函数中最深的块嵌套级别的所有变量,或者他们是否也会考虑活性和变量的范围?

void zoo(int num) {
    if (num) {
        int a = foo();
        bar(a);
    } else {
        int b = foo();
        bar(b);
    }
}

例如,上面的代码将在堆栈上为a和分配不同的偏移量b,即使它们只分配了一个偏移量(例如rbp - 8),它也是合法的。我的问题是,像 gcc 和 clang 这样的编译器会输出为多个变量分配相同静态偏移量的程序集吗?

规范中有关于此的内容吗?

我想知道源变量和编译的汇编文件中存在的堆栈偏移之间是否存在唯一映射。

标签: cmemory-managementstackreverse-engineeringcompiler-optimization

解决方案


通常,具有自动存储持续时间的对象(在函数或块内定义的“本地”对象)和堆栈偏移之间没有唯一的映射。我已经看到编译器生成的代码为不同的对象重用了相同的堆栈位置,要么是因为在 C 代码中使用一个不重叠使用另一个,要么是因为编译器出于任何目的将一个移入寄存器并且不再需要为其使用堆栈位置。

C 和 C++ 标准不要求实现以任何特定方式实现其堆栈分配。他们可以自由地重用堆栈位置。它们还可以自由分配所有可能需要的堆栈空间1或等待查看是否进入了特定块,然后再为这些块内的对象进一步分配堆栈空间。

笔记

1支持可变长度数组的实现通常必须等到可以确定数组的大小后才能为其分配空间。


推荐阅读