Страницы

Поиск по вопросам

среда, 24 апреля 2019 г.

Строгий алиасинг в MinGW-w64

При компиляции с MinGW-w64 этого простого кода:
#include #include #include
template void readWithSep(){ std::istringstream sLine; sLine.str("hello"); std::string line; while(std::getline(sLine, line)){ std::cout<int main(){ readWithSep(); }
выдаётся ошибка:
доступ по указателю с приведением типа нарушает правила перекрытия объектов в памяти [-Werror=strict-aliasing] while(std::getline(sLine, line)){
Компилирую так:
i686-w64-mingw32-g++ -std=c++17 -W -Wall -Wextra -pedantic -Werror -O3 file.cpp
Почему возникает эта ошибка и как её исправить? Здесь же вроде никаких преобразований типов не происходит. Странно, что g++ это компилирует без ошибок (с теми же флагами)
Полный вывод компилятора:
file.cpp: В функции «void readWithSep()»: file.cpp:10:35: ошибка: доступ по указателю с приведением типа нарушает правила перекрытия объектов в памяти [-Werror=strict-aliasing] while(std::getline(sLine, line)){ cc1plus: все предупреждения считаются ошибками


Ответ

Похоже, это бага (точнее регресия) в gcc. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80633
Воспроисводится только при включенном -O2/-O3, потому что на этом уровне включается -ftrict-aliasing. Если компилятор менять не получается или уровень оптимизации, то можно просто добавить -fno-strict-aliasing

Комментариев нет:

Отправить комментарий