vector<bool>:: ошибка push_back в GCC 3.4.3?
Следующий код вылетает для меня, используя GCC для сборки для ARM:
#include <vector>
using namespace std;
void foo(vector<bool>& bools) {
bools.push_back(true);
}
int main(int argc, char** argv) {
vector<bool> bools;
bool b = false;
bools.push_back(b);
}
Мой компилятор: arm_v5t_le-gcc (GCC) 3.4.3 (MontaVista 3.4.3-25.0.30.0501131 2005-07-23)
, Сбой не возникает при сборке для отладки, но происходит с оптимизацией, установленной на -O2.
Да, функция foo необходима для воспроизведения проблемы. Сначала это было очень странно, но я обнаружил, что сбой происходит только тогда, когда вызов push_back не встроен. Если GCC замечает, что метод push_back вызывается более одного раза, он не будет встроен в каждое место. Например, я также могу воспроизвести сбой, дважды вызвав push_back внутри main. Если вы сделаете foo статическим, то gcc может сказать, что он никогда не вызывается, и оптимизирует его, в результате чего push_back будет встроен в main, что приведет к сбою.
Я пробовал это на x86 с gcc 4.3.3, и, похоже, проблема исправлена для этой версии.
Итак, мои вопросы:
Кто-нибудь еще сталкивался с этим? Возможно, есть некоторые флаги компилятора, которые я могу передать, чтобы предотвратить это.
Это ошибка генерации кода в gcc или ошибка в реализации stl (bits/stl_bvector.h)? (Я планирую проверить это сам, когда у меня будет время)
Если это проблема с компилятором, обновление до 4.3.3, что это исправляет, или это переход на x86 с руки?
Кстати, большинство других vector<bool>
методы, кажется, работают. И да, я знаю, что с помощью vector<bool>
не лучший вариант в мире.
2 ответа
Можете ли вы создать свой собственный набор инструментов с помощью gcc 3.4.6 и патчей Монтависты? 3.4.6 - последний выпуск линии 3.x.
Я могу добавить некоторые инструкции о том, как построить кросс-компилятор ARM из источников GCC, если хотите. Я должен делать это все время, так как никто не делает готовые наборы инструментов для Mac OS X.
Я был бы очень удивлен, если это не работает для ARM в gcc 4.x. Но единственный способ проверить, можете ли вы или кто-либо другой попробовать это на ARM-таргетинге gcc 4.x.
Обновление до GCC 4 - безопасная ставка. Его бэкэнд генерации кода заменяет старое представление RTL (язык передачи регистров) на SSA (статическое одиночное назначение). Это изменение позволило значительно переписать оптимизатор.