Сначала я кратко отвечу на ваши вопросы
Как я могу убедиться, что это больше не повторится?
Этот конкретный дефект вы можете исправить и написать модульные тестыдля предотвращения регрессии.В целом, однако, ошибки случаются;Вы не можете предотвратить их, только смягчить их.Используйте инструменты и предупреждения, чтобы попытаться идентифицировать их на ранней стадии.Вы уже делаете хорошую вещь, используя Address Sanitizer (вам также следует проверить Undefined Behavior Sanitizer и Thread Sanitizer).
Есть ли способ воспроизвести его?
Address Sanitizer сообщит об этом 100% времени, когда это произойдет.К сожалению, похоже, что это зависит от того, с какими данными вы работаете.Возможно, попробуйте какие-то искаженные данные, чтобы попытаться убедить их в этом.Вы можете написать модульные тесты (обязательно создавайте свои тесты с включенным Asan) с различными типами данных.Не могу сказать больше, не увидев код.
В чем проблема?
У вас определенно есть ошибка.Асан не сообщает о ложных срабатываниях.Похоже, это может произойти только для плохих данных, но вы никогда не должны верить, что у вас всегда будут хорошие данные.
Нелегко помочь вам решить проблему, не увидев код.Асан, сообщающий о переполнении буфера стека, обычно является одной из следующих вещей (по моему опыту):
- Выделение переменной в стеке и сохранение ссылки на нее.Когда стековый кадр, в котором он был выделен, уничтожается, ссылка больше не действительна.
- Наличие массива в стеке и выход за пределы.
- (редко) Неправильное приведение стекаобъект к объекту большего размера и доступ к «члену», который находится за пределами вершины стека.
Если вы работаете, хотя XCode это должно сломаться, когда Асан прерывает.вы должны увидеть трассировку стека и определить, где в вашем коде это происходит.
Дополнительные инструменты, помогающие определить проблему
- Предупреждения компилятора
Включите и включите как можно больше.Часто, когда вы делаете что-то вроде ссылки на что-то с автоматической продолжительностью хранения, компилятор может предупредить вас об этом.
Clang Static Analyzer
Он также встроен в Xcode и может запускаться с помощью меню Product -> Analyize
.Это должно заполнить проблемы, которые он находит в «навигаторе проблем» в левой колонке XCode.Clang довольно хорошо распознает ошибки памяти