考虑以下简单的c ++程序
#include <iostream>
#include <regex>
int main(int argc, char * argv[])
{
std::regex foobar( "[A]+");
return 0;
}
使用-fpack-struct = 1进行编译时,会出现故障
g++-5 -std=gnu++14 ./fpack_regex.cpp -fpack-struct=1 -o a.out && a.out
Segmentation fault (core dumped)
虽然
g++-5 -std=gnu++14 ./fpack_regex.cpp -o a.out && a.out
工作正常。
为什么pack-struct = 1选项可能导致此失败?
答案 0 :(得分:2)
switch -fpack-struct可能非常危险,例如。请参阅gcc文档警告:
我看到的主要问题是你的代码与标准库不是二进制兼容的(它通常不用打包的结构编译),因此调用(带有转换结构)可能会失败(实际上它们就是这样)。
建议不要使用此开关包装所有结构,但如果您需要包装结构,请仅包装您需要的结构。我还读到重新编译你使用相同fpack-struct的libstd和/或lib可能有所帮助,但无论如何这都是一个冒险的选择。
一些信息也在这里(一个关于fpack-struct的旧gcc bug),它已经过时,但可能有用:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=14173