Как стать автором
Обновить

Ужасный баг в Portland Group C++ компиляторе

Время на прочтение1 мин
Количество просмотров12K
Эта публикация для тех, кто вынужден по долгу службы пользоваться pgcpp компилятором или поддерживать совместимость кода с этим компилятором.

На днях я получил баг репорт, что мой код неправильно работает, если его скомпилировать при помощи pgcpp.

Начав разбираться, я нашел место, где происходит ошибка. Оказалось, что если код компилируется с O2 или O3 оптимизацией, то std::sort может начать дублировать часть вектора и заменять этими дубликатами другие части.

Вот простой C++ код, который поможет воссоздать это ужасное поведение (обратите внимание на число 3193 в выводе):

#include <iostream>
#include <algorithm>
#include <vector>

struct ID{
  ID(){};
  ID(unsigned id) : Id(id){};
  unsigned Id;
  bool operator < ( ID const &other ) const { return Id < other.Id; } };

main(){
  std::vector<ID> ids;

  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<ID>::const_iterator it=ids.begin();it!=ids.end();++it)
    std::cout << it->Id << std::endl;
}


Я тестировал в Linux, но предположительно ошибка происходит и в Windows.

Написал в поддержку и они ответили, что смогли воссоздать «это поведение», так что есть надежда, что баг пофиксят в скором времени. Пока же я рекомендую использовать или std::stable_sort или (если есть возможность выбирать) другой компилятор (у Portland Group есть тоже альтернативный компилятор — pgc++ — и там этот баг не наблюдается).

Всем хорошего дебаггинга и поменьше багов в компиляторах.
Теги:
Хабы:
Всего голосов 40: ↑28 и ↓12+16
Комментарии17

Публикации

Истории

Работа

QT разработчик
5 вакансий
Программист C++
108 вакансий

Ближайшие события

7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань