#pragma pack (1) вызывает ошибку сегментации - PullRequest
0 голосов
/ 09 февраля 2020

В какой-то момент код моего большого проекта начал получать ошибка сегментации ошибки времени выполнения с такой трассировкой стека:

0 # std :: basic_ ios> :: widen (__c = 10 '\ n', это =) в /usr/include/c++/7/bits/basic_ios.h:450
1 # std :: endl> (__os = ...) в / usr / include / c ++ / 7 / ostream: 591
2 # std :: ostream :: operator << (__pf =, this =) в / usr / include / c ++ / 7 / ostream: 113 <br>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 ... из l oop)
  • движется #include <iostream> до #pragma pack(1)

Пробное здание с g ++ 7.4. 0 и g ++ 9.2.1 (те же результаты).

1 Ответ

2 голосов
/ 09 февраля 2020
#pragma pack(1)
// ...
#include <iostream>

Вы применили пакет #pragma к объявлениям в заголовках стандартной библиотеки, которые вы включаете. Стандартная библиотека, на которую ваш исполняемый файл ссылается во время выполнения, вероятно, не применяла прагму. Ваш исполняемый файл не совместим с используемой библиотекой времени выполнения.

...