==44088==错误:AddressSanitizer:堆栈缓冲区溢出

inv*_*ent 0 ios address-sanitizer swift

我的项目是 swift-only(至少对于我写的代码)。在应用程序开始时,我下载了一些 json 来显示内容。我用swift 4 Coder protocol. 这已经工作了一段时间,但刚才我遇到了一个意外的堆栈缓冲区溢出错误:

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

在后台线程之一中反序列化其中一个对象时。

基于此,我有两个问题

我怎样才能确保这种情况不再发生?

有没有办法重现它?

更多信息:

我有这个摘要,但我不知道该怎么做:

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

编辑:

它每次都重现(在模拟器中)。然后我清理了构建并删除了派生数据文件夹,此后就没有发生过。我仍然想知道我是否需要担心生产中的错误...

Bra*_*red 7

首先我简单回答你的问题

我怎样才能确保这种情况不再发生?

您可以修复此特定缺陷并为其编写单元测试以防止出现回归。然而,一般来说,错误会发生。你不能阻止它们,只能减轻它们。使用工具和警告尽早尝试识别它们。您已经通过使用 Address Sanitizer 做了一件好事(您还应该查看 Undefined Behavior Sanitizer 和 Thread Sanitizer)。

有没有办法重现它?

Address Sanitizer 会在发生时 100% 报告它。不幸的是,这听起来取决于您正在使用的数据。也许尝试一些格式错误的数据来尝试诱使它发生。您可以使用各种类型的数据编写单元测试(确保在启用 Asan 的情况下构建您的测试)。不看代码就不能多说。

问题是什么?

你肯定有bug。Asan 不报告误报。听起来它可能只发生在坏数据上,但你永远不应该相信你总会有好的数据。

在不看代码的情况下帮助您解决问题并不容易。Asan 报告堆栈缓冲区溢出通常是其中之一(以我的经验):

  1. 在堆栈上分配一个变量并保留对它的引用。当分配给它的堆栈帧被销毁时,引用不再有效。
  2. 在堆栈上有一个数组并且越界。
  3. (很少)将堆栈对象不正确地转换为更大尺寸的对象并访问超出堆栈顶部的“成员”。

如果您通过 Xcode 运行它应该会在 Asan 中止时中断。您应该能够看到堆栈跟踪并找到代码中发生这种情况的位置。

帮助识别问题的其他工具

  1. 编译器警告

尽可能多地打开和打开这些。通常,当您执行诸如引用具有自动存储持续时间的内容之类的操作时,编译器会警告您。

  1. Clang 静态分析器

这也内置在 Xcode 中,可以通过Product -> Analyize菜单运行。这应该填充它在 Xcode 左列的“问题导航器”中找到的问题。Clang 非常擅长识别内存错误