При компиляции с 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: все предупреждения считаются ошибками
Похоже, это бага (точнее регресия) в gcc. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80633
Воспроисводится только при включенном -O2/-O3, потому что на этом уровне включается -ftrict-aliasing. Если компилятор менять не получается или уровень оптимизации, то можно просто добавить -fno-strict-aliasing.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости