WedX - журнал о программировании и компьютерных науках

Global std::string вызывает сбой на iOS

Я отправил это в Apple как ошибку, но просто для подтверждения вот тестовый код:

#include <string>

std::string home_directory;

std::string BuildPath(const std::string directory, const std::string path)
{
  if(home_directory.compare(directory) == 0)
    printf("In home directory\n");

  return directory + "/" + path;
}

int main(int, char* [])
{
  home_directory = "home";
  printf("Home: '%s'\n", home_directory.c_str());
  printf("BuildPath: '%s'\n", BuildPath("base", "path").c_str());
}

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

Выход

Home: 'home'
CrashTest(1242) malloc: *** error for object 0x2fe2ac80: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug

Сканирование стека:

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x00000000, 0x00000000
Crashed Thread:  0

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libsystem_kernel.dylib          0x34fb8848 __kill + 8
1   libsystem_c.dylib               0x36eae2ae abort + 110
2   libsystem_c.dylib               0x36e6937a free + 374
3   libstdc++.6.dylib               0x3481a93a operator delete(void*) + 6
4   libstdc++.6.dylib               0x34806138 std::string::_Rep::_M_dispose(std::allocator<char> const&) + 68
5   libstdc++.6.dylib               0x34806c04 std::string::reserve(unsigned long) + 156
6   libstdc++.6.dylib               0x34806daa std::string::append(char const*, unsigned long) + 70
7   CrashTest                       0x00094a30 BuildPath(std::string, std::string) (basic_string.h:2121)
8   CrashTest                       0x00094bda main (main.cpp:25)
9   CrashTest                       0x0009499c start + 32

С уровнями оптимизации -O1 или ниже или с использованием libc++ в качестве стандартной библиотеки все работает так, как ожидалось. Он также работает должным образом на iOS 6 или 7. При сборке с предыдущим выпуском XCode (5.0.2, iOS SDK 7.0 и LLVM 5.0) он работает нормально независимо от настроек оптимизации.

Комментирование сравнения с глобальной строкой также позволяет избежать сбоя.

Может ли кто-нибудь увидеть какие-либо проблемы с моим кодом? Если нет, то есть какие-нибудь теории о причине крушения? Возможно, новая оптимизация LLVM вызывает ошибку в среде выполнения libstdc++ в iOS 5.1?

Другой вариант, о котором я могу думать, заключается в том, что оптимизатор генерирует недопустимый код. Это было бы гораздо большим беспокойством.

26.03.2014

  • Попробуйте заменить std::string на vstring из каталога расширений. 26.03.2014
  • Это минимальный тестовый пример из нашего более крупного кроссплатформенного проекта. Я не хочу везде заменять std::string. 26.03.2014
  • Я не вижу никаких технических проблем с кодом. Похоже, что home_directory не был инициализирован. Но стандарт С++ 11 требует в §3.6.2/4, чтобы он был инициализирован либо до первого оператора main, либо, если после, то до первого использования odr (3.2) любой функции или переменной, определенной в том же переводе единица в качестве переменной. Что бы ни было сделано, это гарантирует, что оно будет инициализировано в то время, когда оно используется здесь. Здесь есть тонкий момент относительно времени во время первого утверждения main. Странное поведение g++ часто связано с тонкостями, извращенной идеей компилятора. 26.03.2014
  • Я также пытался инициализировать home_directory, когда он был объявлен, точно такое же поведение. Первый printf в main показывает, что он имеет ожидаемое значение (и printf в BuildPath показывает то же самое), но я полагаю, что сам объект мог быть неправильно инициализирован, что привело к тому, что он работал для присваивания, но на самом деле уничтожал некоторые другие объем памяти? 26.03.2014
  • Похоже, в free() произошел сбой, вероятно, при удалении временного объекта, созданного в операторе return. Это определенно ошибка, возможно, ошибка библиотеки, в этом коде нет ничего плохого. Я видел много этих странных маленьких ошибок, связанных с C, начиная с Xcode 5.0. Я тоже сообщал о них - надеюсь, они скоро будут исправлены. Хотя тот факт, что это происходит только в версиях до iOS 6, мало поможет. У Apple нет особой мотивации исправлять это, учитывая их высокий уровень проникновения обновлений. 27.03.2014
  • У меня та же проблема с SDK xcode 5.1/iOS 7.1 на ios 5.1.1, которая возникает при попытке объединить строку, которая выглядит практически так же, как ваша строка кода «каталог +/» при построении с оптимизацией. Он пытается выделить ~ 800 МБ памяти при расширении строки и приводит к сбою приложения. 27.03.2014
  • Apple закрыла ошибку с некоторым стандартным сообщением о том, что не заботится об ошибках, которые затрагивают только iOS 5, несмотря на мои протесты о желании подтвердить, что это не проблема компилятора/оптимизатора. Раздражающий. 01.04.2014
  • У нас такая же ошибка. Вылетает только iOS 5.1.1. Если приложение было скомпилировано в XCode 5.0 - ВСЕ В ПОРЯДКЕ. Если в XCode 5.1 - видим краш. Оптимальный уровень решения проблемы в XCOde 5.1, но это не лучший способ. Кто-нибудь сообщил Apple об этой ошибке в XCode 5.1? 02.04.2014
  • Есть ли причина, по которой вы не запускаете свой тестовый пример под gdb и не проходите через него? Вы не можете просто слепо доверять такой оптимизированной трассировке стека — некоторые сайты вызовов на самом деле будут обратными адресами, а не источниками. Кроме того, ваш фактический код не передает std::string по значению, не так ли? Код по-прежнему дает сбой, если вы замените return назначением локальной переменной, за которым следует возврат локальной переменной? ideone.com/x7Ajch 10.04.2014

Ответы:


1

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

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

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

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

10.04.2014
  • Я не тестировал семя GM, но позже Apple выпустила XCode 5.1.1 (и связанные инструменты командной строки) в качестве обновления App Store. Использование этой версии устраняет сбои как в небольшом тестовом примере выше, так и в моем более крупном приложении. 23.04.2014
  • Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]