#pragma pack(1) 导致段错误

#pragma pack(1) causes segmentation fault

在某些时候,我的大项目的代码开始出现 分段错误 运行时错误,此类堆栈跟踪:

0# std::basic_ios >::widen (__c=10 '\n', this=) at /usr/include/c++/7/bits/basic_ios.h:450
1# std::endl > (__os=...) at /usr/include/c++/7/ostream:591
2# std::ostream::operator<< (__pf=, this=) at /usr/include/c++/7/ostream:113
3# main () at segfault.cpp:11

最后一个 (3#) 总是指向 std::cout 行,例如 std::cout << "hello" << std::endl;

所以我将我的代码简化为这个仍然会导致相同错误的最小结构:

#pragma pack(1)
struct Point {
    int x;
};

#include <iostream>

int main()
{
    for(;;){
        std::cout << "hello" << std::endl;
    }
}

使用 g++ -std=c++17 segfault.cpp -o segfault -g -Ofast 命令构建。

执行以下任何操作可取消错误:

尝试使用 g++ 7.4.0g++ 9.2.1 构建(结果相同)。

#pragma pack(1)
// ...
#include <iostream>

您已将#pragma pack 应用于您包含的标准库header(s) 中的声明。您的可执行文件在运行时链接到的标准库可能没有应用 pragma。您的可执行文件与正在使用的运行时库不兼容。