gpt4 book ai didi

c++ - 为什么这个独立程序会出现段错误?

转载 作者:行者123 更新时间:2023-12-05 01:49:14 25 4
gpt4 key购买 nike

我发现了一个我无法解释的有趣行为。我写了这个非常简单的程序,没有明显的原因就出现了段错误。拜托,有人可以解释这里发生了什么吗?

  • 该程序在 Ubuntu 中运行(我不知道这是否重要)。
  • 没有包含,没有库,没有到 stdlib 的链接。没有任何依赖性。

我已经测试过,当发生以下任一情况时,段错误就会消失:

  • stdlib 已链接(并将 _start 重命名为 main,删除了 extern "C"等)
  • 使用 GCC
  • 已启用优化

以下是该程序唯一的代码文件,我们称之为main.cpp

构建它:clang main.cpp -nostdlib

struct A
{
A () = default;
A (const A &) = default;
// A (A &) = default;

char * a = nullptr;
unsigned long long b;
};

struct ConvertibleToA
{
ConvertibleToA() = default; // default constructor
operator A() { return m_a; } // conversion to type A
A m_a;
};

extern "C"
void _start()
{
ConvertibleToA my_convertible{};
A my_a = my_convertible;
}

最佳答案

检查堆栈对齐方式。对于 SysV ABI,rsp 保证在程序入口处是 16 字节对齐的。但是,由于 call 推送的地址,普通函数期望 rsp 是 16 字节 + 8 对齐的。

Clang 使用会崩溃的 SSE 对齐指令,而 GCC 不会。

关于c++ - 为什么这个独立程序会出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74332999/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com