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 (статическое одиночное назначение). Это изменение позволило значительно переписать оптимизатор.

Другие вопросы по тегам