#pragma pack(1) вызывает ошибку сегментации
В какой-то момент код моего большого проекта начал получать ошибки времени выполнения segmentation fault с такой трассировкой стека:
0# std:: basic_ios>:: widen (__c = 10 '\ n', this =) в /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 () в segfault.cpp: 11
где last (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)
- удаление
-Ofast
из вариантов g ++ - удаление
for(;;){
(движетсяstd::cout ...
вне цикла) - перемещение
#include <iostream>
перед#pragma pack(1)
Пробовал строить с g++ 7.4.0 и g ++ 9.2.1 (те же результаты).
1 ответ
#pragma pack(1) // ... #include <iostream>
Вы применили #pragma pack к объявлениям в заголовках стандартной библиотеки, которые вы включаете. Стандартная библиотека, на которую ссылается ваш исполняемый файл во время выполнения, вероятно, не применяла прагму. Ваш исполняемый файл несовместим с используемой библиотекой времени выполнения.