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

时间:2018-06-25 18:48:44

标签: ios swift address-sanitizer

我的项目仅是swift的(至少对于我编写的代码而言)。在应用程序的开头,我下载了一些json来显示内容。我使用swift 4 Coder protocol反序列化此内容。这已经有一段时间了,但是现在我遇到了意外的堆栈缓冲区溢出错误:

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

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

基于此,我有2个问题

如何确保这种情况不再发生?

有没有办法复制它?

更多信息:

我有此摘要,但是我不确定该怎么做:

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

编辑:

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

1 个答案:

答案 0 :(得分:2)

首先,我将简要回答您的问题

  

如何确保这种情况不再发生?

您可以修复并编写单元测试以防止发生回归的特定缺陷。但是,总的来说,会发生错误。您无法阻止它们,只能缓解它们。使用工具和警告尽早识别它们。通过使用Address Sanitizer,您已经做得很好(还应该查看Undefined Behavior Sanitizer和Thread Sanitizer)。

  

有没有办法复制它?

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

出什么问题了?

您肯定有一个错误。牙山没有举报误报。听起来这可能只发生在不良数据上,但您永远不要相信自己将永远拥有优质数据。

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

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

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

帮助发现问题的其他工具

  1. 编译器警告

尽可能多地打开和打开它们。通常,当您执行诸如引用具有自动存储期限的操作之类的操作时,编译器可能会警告您。

  1. C语静态分析器

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