Сбой конкатенации Xcode 5.1 std::string на устройствах iOS 5.1 в релизных сборках

При сборке с последними версиями XCode 5.1, iOS SDK 7.1 и LLVM 5.1 с использованием libstdc++ для стандартной библиотеки C++ происходит сбой в методе std::string append только на устройстве iOS 5.1.

Вот пример кода:

class TestClass
{
public:
    TestClass()
    {
        m_string = "string1";
    }

    void AppendString()
    {
        m_string += std::string("string2");
        std::string newString2 = m_string + "string3";
    }

private:
    string m_string;
};

Приложение падает в методе AppendString() в этой строке:

        std::string newString2 = m_string + "string3";

Если я удалю эту строку m_string += std::string("string2"); перед созданием newString2, код будет работать нормально.

Вот трассировка стека сбоя:

#0  0x34c99fe8 in memcpy$VARIANT$CortexA8 ()
#1  0x3706f95a in std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned long) ()
#2  0x3706fbfa in std::string::reserve(unsigned long) ()
#3  0x3706fdb0 in std::string::append(char const*, unsigned long) ()
#4  0x000c0e5a in std::basic_string<char, std::char_traits<char>, std::allocator<char> > std::operator+<char, std::char_traits<char>, std::allocator<char> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char const*) [inlined] at /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk/usr/include/c++/4.2.1/bits/basic_string.h:2121
#5  0x000c0e3c in TestClass::AppendString() at /Users/sergei/Documents/2_3/House of Fun/cpp/CasinoSceneManager.cpp:122

Кто-нибудь испытал такой же сбой? Это происходит только на устройствах с iOS 5.1 и 5.1.1 и только если приложение было скомпилировано с флагом выпуск, а не отладка.

Спасибо вам за помощь.


Еще одно замечание. Если я изменю Уровень оптимизации на Нет [-O0] в разделе Генерация кода в настройках проекта, все будет работать нормально. Возможно, проблема как-то связана с оптимизацией кода.


person Sergei    schedule 09.04.2014    source источник
comment
Еще одно замечание. Если я изменю эту строку с std::string newString2 = m_string + "string3" на std::string newString2 = std::string(m_string) + "string3", код также будет работать нормально.   -  person Sergei    schedule 09.04.2014
comment
Это единственный код, который вы используете, или программа делает что-то еще? Звучит как проблема с недействительными объектами.   -  person molbdnilo    schedule 09.04.2014
comment
Это просто тестовый класс, чтобы показать проблему. В основном цикле моего приложения для iOS я вызываю его с помощью этого кода: TestClass* c = new TestClass; c->AppendString();   -  person Sergei    schedule 09.04.2014
comment
И это весь класс? Если это так, ошибка, скорее всего, заключается в окружающем коде, где что-то имеет неопределенное поведение.   -  person molbdnilo    schedule 09.04.2014
comment
Я не могу показать весь код, потому что проект очень большой. Все, что я хотел, это сказать, что если у вас есть переменная std::string в качестве поля класса, и вы пытаетесь объединить ее с другой строкой и назначить результат объединения другой переменной std::string, приложение вылетит, но только на устройствах iOS 5.1. .   -  person Sergei    schedule 09.04.2014
comment
Скорее всего, у вас где-то есть какие-то повреждения памяти. Это не связано с конкатенацией строк, но раскрывается ею. Это все предположения, которые возможны с предоставленной информацией.   -  person molbdnilo    schedule 09.04.2014


Ответы (1)


Apple выпустила новое семя GM для Xcode 5.1.1. В примечаниях к выпуску говорится, что они исправили пару сбоев:

Исправлен сбой скомпилированного кода при нацеливании на iOS 5.1.1. (16485980)!

Исправлен сбой скомпилированного кода при использовании ARC и C++. (16368824)

http://adcdownload.apple.com//Developer_Tools/xcode_5.1.1_gm_seed/release_notes_xcode_5.1.1_gm_seed.pdf

person Brian Teschke    schedule 10.04.2014
comment
Да, загрузка Xcode 5.1.1 устранила проблему) Спасибо - person Sergei; 11.04.2014