小编Ans*_*man的帖子

为什么 g++ 编译的代码会超出堆栈指针的范围?

为了更好地理解汇编,我使用 g++ 编译了一个简单的 C++ 程序,然后使用 gdbgui 逐步执行。我制作了一个堆栈状态的图形,并在程序中的几个连续点进行了注册,以帮助自己更好地了解正在发生的事情。似乎程序在执行期间多次在堆栈指针之外的内存中写入/读取。这让我很惊讶。我的印象是程序永远不应该写超出堆栈指针的范围。我理解它是如何工作的,相对寻址基于基指针,但我希望程序以某种方式调整堆栈指针以包含它计划使用的内存。这种超出堆栈的写入方法是编译器的常用技术吗?

C++:

#include <iostream>

int square(int i) {
    i = i * i;
    return i;
}

int main() {
    int i = square(2);
}

Run Code Online (Sandbox Code Playgroud)

在 Ubuntu 19.10 上编译:

g++ -o square_2 square_2.cpp
Run Code Online (Sandbox Code Playgroud)

g++ 版本:

g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none:hsa
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.2.1-9ubuntu2' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib …
Run Code Online (Sandbox Code Playgroud)

c++ gcc disassembly

6
推荐指数
1
解决办法
87
查看次数

标签 统计

c++ ×1

disassembly ×1

gcc ×1