== 44088 == ОШИБКА: AddressSanitizer: переполнение буфера стека - PullRequest
0 голосов
/ 25 июня 2018

Мой проект предназначен только для быстрой работы (для кода, который я написал, по крайней мере).В начале приложения я загружаю некоторые json, чтобы показать контент.Я десериализирую этот контент с swift 4 Coder protocol.Некоторое время это работало, но только сейчас я получил неожиданную ошибку переполнения стекового буфера:

==44088==ERROR: AddressSanitizer: stack-buffer-overflow

при десериализации одного из объектов в одном из фоновых потоков.

Исходя из этого, У меня есть 2 вопроса :

Как я могу убедиться, что это больше не повторится?

Есть ли способ воспроизвести его?

Дополнительная информация:

У меня есть это резюме, но я не уверен, что делать сit:

SUMMARY: AddressSanitizer: stack-buffer-overflow JsonClass.swift in _T06MyApp11JsonClassVACs7Decoder_p4from_tKcfC Shadow bytes around the buggy address: 0x100026a904d0: 00 02 f2 f2 f2 f2 f2 f2 f2 f2 00 00 00 00 00 00 0x100026a904e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x100026a904f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x100026a90500: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x100026a90510: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 =>0x100026a90520: 00 00 00 00 00 00 00 00 00 00 00 00 00 00[f2]f2 0x100026a90530: f2 f2 f2 f2 f2 f2 f2 f2 f2 f2 f2 f2 f2 f2 00 00 0x100026a90540: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x100026a90550: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x100026a90560: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x100026a90570: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Shadow byte legend (one shadow byte represents 8 application bytes): Addressable: 00 Partially addressable: 01 02 03 04 05 06 07 Heap left redzone: fa Freed heap region: fd Stack left redzone: f1 Stack mid redzone: f2 Stack right redzone: f3 Stack after return: f5 Stack use after scope: f8 Global redzone: f9 Global init order: f6 Poisoned by user: f7 Container overflow: fc Array cookie: ac Intra object redzone: bb ASan internal: fe Left alloca redzone: ca Right alloca redzone: cb

EDIT:

Воспроизводится каждый раз (в симуляторе).Затем я очистил сборку и удалил папку с производными данными, и с тех пор этого не произошло.Я все еще хотел бы знать, нужно ли мне беспокоиться об ошибке в работе ...

1 Ответ

0 голосов
/ 27 июня 2018

Сначала я кратко отвечу на ваши вопросы

Как я могу убедиться, что это больше не повторится?

Этот конкретный дефект вы можете исправить и написать модульные тестыдля предотвращения регрессии.В целом, однако, ошибки случаются;Вы не можете предотвратить их, только смягчить их.Используйте инструменты и предупреждения, чтобы попытаться идентифицировать их на ранней стадии.Вы уже делаете хорошую вещь, используя Address Sanitizer (вам также следует проверить Undefined Behavior Sanitizer и Thread Sanitizer).

Есть ли способ воспроизвести его?

Address Sanitizer сообщит об этом 100% времени, когда это произойдет.К сожалению, похоже, что это зависит от того, с какими данными вы работаете.Возможно, попробуйте какие-то искаженные данные, чтобы попытаться убедить их в этом.Вы можете написать модульные тесты (обязательно создавайте свои тесты с включенным Asan) с различными типами данных.Не могу сказать больше, не увидев код.

В чем проблема?

У вас определенно есть ошибка.Асан не сообщает о ложных срабатываниях.Похоже, это может произойти только для плохих данных, но вы никогда не должны верить, что у вас всегда будут хорошие данные.

Нелегко помочь вам решить проблему, не увидев код.Асан, сообщающий о переполнении буфера стека, обычно является одной из следующих вещей (по моему опыту):

  1. Выделение переменной в стеке и сохранение ссылки на нее.Когда стековый кадр, в котором он был выделен, уничтожается, ссылка больше не действительна.
  2. Наличие массива в стеке и выход за пределы.
  3. (редко) Неправильное приведение стекаобъект к объекту большего размера и доступ к «члену», который находится за пределами вершины стека.

Если вы работаете, хотя XCode это должно сломаться, когда Асан прерывает.вы должны увидеть трассировку стека и определить, где в вашем коде это происходит.

Дополнительные инструменты, помогающие определить проблему

  1. Предупреждения компилятора

Включите и включите как можно больше.Часто, когда вы делаете что-то вроде ссылки на что-то с автоматической продолжительностью хранения, компилятор может предупредить вас об этом.

Clang Static Analyzer

Он также встроен в Xcode и может запускаться с помощью меню Product -> Analyize.Это должно заполнить проблемы, которые он находит в «навигаторе проблем» в левой колонке XCode.Clang довольно хорошо распознает ошибки памяти

...