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

270
11 ноября 2017, 13:23

При компиляции с MinGW-w64 этого простого кода:

#include <string>
#include <sstream>
#include <iostream>
template <typename T>
void readWithSep(){
    std::istringstream sLine;
    sLine.str("hello");
    std::string line;
    while(std::getline(sLine, line)){
        std::cout<<line;
    }
}
int main(){
    readWithSep<char>();
}

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

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

Answer 1

Похоже, это бага (точнее регресия) в gcc. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80633

Воспроисводится только при включенном -O2/-O3, потому что на этом уровне включается -ftrict-aliasing. Если компилятор менять не получается или уровень оптимизации, то можно просто добавить -fno-strict-aliasing.

READ ALSO
Код на С++ который делает реверс звука [требует правки]

Код на С++ который делает реверс звука [требует правки]

Может ктото имет код на С++ в котором есть функция которая делает реверс звука, переключает канал с правого на левыйНужно чтоб изменялся канал...

255
QFutureWatcher и ожидание main потока QT

QFutureWatcher и ожидание main потока QT

Приветствую! Волнует одна большая для меня проблема которую никак не получается решитьРечь идет о многопоточности а именно пытаюсь реализовать...

289