#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
命令构建。
执行以下任何操作可取消错误:
- 删除
#pragma pack(1)
- 从 g++ 选项中删除
-Ofast
- 删除
for(;;){
(将 std::cout ...
移出循环)
- 在
#pragma pack(1)
之前移动 #include <iostream>
尝试使用 g++ 7.4.0 和 g++ 9.2.1 构建(结果相同)。
#pragma pack(1)
// ...
#include <iostream>
您已将#pragma pack 应用于您包含的标准库header(s) 中的声明。您的可执行文件在运行时链接到的标准库可能没有应用 pragma。您的可执行文件与正在使用的运行时库不兼容。
在某些时候,我的大项目的代码开始出现 分段错误 运行时错误,此类堆栈跟踪:
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
命令构建。
执行以下任何操作可取消错误:
- 删除
#pragma pack(1)
- 从 g++ 选项中删除
-Ofast
- 删除
for(;;){
(将std::cout ...
移出循环) - 在
#pragma pack(1)
之前移动
#include <iostream>
尝试使用 g++ 7.4.0 和 g++ 9.2.1 构建(结果相同)。
#pragma pack(1) // ... #include <iostream>
您已将#pragma pack 应用于您包含的标准库header(s) 中的声明。您的可执行文件在运行时链接到的标准库可能没有应用 pragma。您的可执行文件与正在使用的运行时库不兼容。