Еще одна ошибка была обнаружена в популярном компиляторе gcc, а точнее в его оптимизаторе, приводящая к ошибке Runtime во время выполнения программы.
При включении опции компилятора 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 любой версии.
Ошибка была исправлена Ричардом Гюнтером, и сегодня исправление было загружено на репозиторий gcc .
Будьте осторожны при написании программ для АЭС и ядерных боеголовок с использованием gcc :) Отчет об ошибке .
Теги: #GCC #ошибка #критическая #ошибка выполнения #C++
-
Волоф
19 Oct, 24 -
Встреть Нас! Lenovo Ideapad 100S
19 Oct, 24