vector <bool>:: ошибка push_back в GCC 3.4.3? - PullRequest
1 голос
/ 19 января 2010

Сбой следующего кода для меня при использовании 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 ]

1 голос
/ 19 января 2010

Обновление до GCC 4 - безопасная ставка. Его серверная часть генерации кода заменяет старое представление RTL (язык передачи регистров) на SSA (статическое одиночное назначение). Это изменение позволило значительно переписать оптимизатор.

1 голос
/ 19 января 2010

Можете ли вы создать свой собственный набор инструментов с помощью gcc 3.4.6 и патчей Монтависты? 3.4.6 - последний выпуск строки 3.x.

Я могу добавить некоторые инструкции о том, как построить кросс-компилятор ARM из источников GCC, если хотите. Я должен делать это все время, так как никто не делает готовые наборы инструментов для Mac OS X.

Я был бы очень удивлен, если это не работает для ARM в gcc 4.x. Но единственный способ проверить, можете ли вы или кто-либо другой попробовать это на ARC-таргетинге gcc 4.x.

...