Странная случайная внутренняя ошибка компилятора в C++ Builder 2010

У меня есть код, который помещает набор TNotifyEvents в вектор.

std::vector<TNotifyEvent> m_availableCallbacks;

Это элемент главной формы приложения. В конструкторе форм он заполняется событиями.

m_availableCallbacks.push_back(ReadoutLastValue);
m_availableCallbacks.push_back(ReadoutCurrentDay);
m_availableCallbacks.push_back(ReadoutLastDay);
m_availableCallbacks.push_back(Readout7Days);
m_availableCallbacks.push_back(Readout1Month);
m_availableCallbacks.push_back(ReadoutChooseTimeSpan);
m_availableCallbacks.push_back(ReadoutAllData);

Затем этот вектор повторяется и используется для создания всплывающего меню и назначения событий уведомлений элементам в этом всплывающем меню.

Локальная компиляция не представляет проблемы. Когда я скомпилировал его на сервере сборки (под управлением TeamCity 6.5), я получил внутреннюю ошибку компилятора в строке, равной второму вызову push_back.

Я попытался отключить предварительно скомпилированные заголовки интеллектуального кэша локально в агенте сборки, отредактировав файлы cbproj. Это произвело успешную сборку. Поэтому я удалил директиву об использовании предварительно скомпилированных заголовков интеллектуального кэша из всех файлов cbproj и зафиксировал изменения. Я сказал TeamCity выполнить чистую проверку и снова получил ту же внутреннюю ошибку компилятора в том же месте. Странно то, что запуск новой компиляции после неудачной завершается успешно, так что это кажется чрезвычайно случайным.

Что происходит? Я привык передавать указатели функций (созданные мной самостоятельно) в других компиляторах C++. Нарушена ли внутренняя обработка TNotifyEvents или компилятор просто нестабилен и легко ломается?

Глядя на другой код, использующий TNotifyEvents, они не работают со ссылками или указателями, поэтому я не пробовал. И поскольку код (когда он компилируется) работает так, как задумано, это не проблема.

Обновление:

Я могу добавить, что журнал для TeamCity говорит, что файл FrontEnd.cpp (который содержит этот код) пропускается, когда я повторно запускаю компиляцию, и она завершается успешно.

[10:04:37]: [MakeObjs] CallTarget
[10:04:37]:   [CallTarget] _CppDepCheck
[10:04:44]:     [_CppDepCheck] MessageMap
[10:04:44]:       [MessageMap] Skipping: ..., FrontEnd.cpp, ...

И даже для того, чтобы это работало, компиляция должна была завершиться успешно, когда произошла внутренняя ошибка компилятора. Как иначе он мог бы пропустить компиляцию файла и при этом волшебным образом появиться и использоваться в скомпилированной форме? :)

Обновление 2

После расследования я могу подтвердить, что это происходит ТОЛЬКО при компиляции в режиме выпуска. В релизе это происходит даже на моей локальной машине в IDE. Я пробовал возиться с такими настройками, как

  • Отключить все оптимизации
  • Создать самый быстрый код из возможных
  • Файлы внешнего типа
  • и так далее

очистка сборки между каждой попыткой. Но ДВС никуда не делся. Однако мне удалось заставить его жаловаться на другое место в другом файле. Возвращение к прежним настройкам НЕ приводит к возврату ошибки в файл FrontEnd.cpp. Этот компилятор кажется шатким :)

На самом деле я начал получать ICE по всему коду, и мне пришлось перезапустить IDE, чтобы вообще что-нибудь скомпилировать.


person inquam    schedule 30.05.2012    source источник
comment
У меня были похожие ICE с BCB2010, когда я широко использовал указатели на функции. Для меня проблема возникала бы случайным образом при передаче указателя на голую функцию функции, которая ожидала boost::function в качестве параметра. Передача boost::bind(&class:function, this) вместо этого, казалось, исправила это для меня. уже...   -  person Roddy    schedule 15.01.2014


Ответы (1)


Кажется, это связано с std::vector. Не уверен, что он сломан сам по себе или проблема в том, как он обрабатывается bcc. Но переход на массив C-стиля в качестве теста вместо этого заставил ICE исчезнуть, и теперь он отлично работает как в режиме отладки, так и в режиме выпуска.

TNotifyEvent m_availableCallbacks[7];

Я хотел избежать этого, поскольку добавление новых событий в вектор потребовало бы почти одной строки кода. Теперь будет немного больше, чтобы помнить, чтобы изменить также. Но лучше, чтобы приложение скомпилировалось.

Если я ошибаюсь, думая, что это ошибка в BCC, пожалуйста, поправьте меня, чтобы я мог вернуться к использованию вектора как можно скорее :)... В противном случае я надеюсь, что Embarcadero исправит это как можно скорее.

person inquam    schedule 30.05.2012
comment
Для тех, кто заинтересован, об этом было сообщено Embarcadero как id 106025. - person inquam; 31.05.2012