Pull to refresh

Критическая ошибка gcc

Reading time 1 min
Views 2.7K
В популярном компиляторе gcc, а конкретнее — в его оптимизаторе, была обнаружена очередная ошибка, приводящая к Runtime error в процессе выполнения программы. При включённой опции компилятора O2, оптимизатор неверно обрабатывает определённый шаблон программы, что приводит к фатальным последствиям.

Баг запостил наш соотечественник Иванов Максим (http://e-maxx.ru), к слову, отправляющийся через месяц на чемпионат мира по программированию ACM. :)
Минимизированный тест-код выглядит следующим образом:
for (int i=0; i<=1; i++)
for (int j=0; j<=1; j++) {
std::vector a[2];
a[i].push_back (0);
}



Ошибка проявляется, если положить локальный массив векторов в двойной вложенный цикл — при первой же попытке записи в вектор мы получим Runtime. При этом, оптимизация проходит нормально при выполнении хотя бы одного из следующих условий:
а) Размер массива векторов больше, чем гуляет цикл
б) Обращаться к вектору не по a[i], а через a[0], или a[1], или любое другое константное значение
в) Перед записью в вектор выполнить a = std::vector();

Стоит отметить, что данный код корректно комплиируется в Visual Studio любой версии.
Ошибка была устранена Ричардом Гюнтером (Richard Guenther) и фикс залит сегодня в gcc репозиторий.

Будьте аккуратны при написании программ для атомных станций и ядерных боеголовок с применением gcc :)

Баг репорт.
Tags:
Hubs:
+20
Comments 40
Comments Comments 40

Articles