Страницы

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

пятница, 14 февраля 2020 г.

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

#cpp #шаблоны_с++ #mingw #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<();
}


выдаётся ошибка: 


  доступ по указателю с приведением типа нарушает правила перекрытия
  объектов в памяти [-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: все предупреждения считаются ошибками

    


Ответы

Ответ 1



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

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

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