[Из песочницы] Ужасный баг в Portland Group C++ компиляторе
Эта публикация для тех, кто вынужден по долгу службы пользоваться pgcpp компилятором или поддерживать совместимость кода с этим компилятором.На днях я получил баг репорт, что мой код неправильно работает, если его скомпилировать при помощи pgcpp.
Начав разбираться, я нашел место, где происходит ошибка. Оказалось, что если код компилируется с O2 или O3 оптимизацией, то std: sort может начать дублировать часть вектора и заменять этими дубликатами другие части.
Вот простой C++ код, который поможет воссоздать это ужасное поведение (обратите внимание на число 3193 в выводе):
#include
struct ID{ ID (){}; ID (unsigned id) : Id (id){}; unsigned Id; bool operator < ( ID const &other ) const { return Id < other.Id; } };
main (){
std: vector
for (unsigned i=0; i < 5; ++i) for (unsigned id=0; id < 2000; ++id ) ids.push_back(ID(id*5+i));
std: sort (ids.begin (), ids.end ());
// std: stable_sort (ids.begin (), ids.end ());
for (std: vector
Написал в поддержку и они ответили, что смогли воссоздать «это поведение», так что есть надежда, что баг пофиксят в скором времени. Пока же я рекомендую использовать или std: stable_sort или (если есть возможность выбирать) другой компилятор (у Portland Group есть тоже альтернативный компилятор — pgc++ — и там этот баг не наблюдается).
Всем хорошего дебаггинга и поменьше багов в компиляторах.