#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 к объявлениям в заголовках стандартной библиотеки, которые вы включаете. Стандартная библиотека, на которую ссылается ваш исполняемый файл во время выполнения, вероятно, не применяла прагму. Ваш исполняемый файл несовместим с используемой библиотекой времени выполнения.

Другие вопросы по тегам