我的项目仅是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
编辑:
每次都复制(在模拟器中)。然后,我清理了构建并删除了派生的数据文件夹,此后没有发生。我仍然想知道我是否需要担心生产中的错误...
答案 0 :(得分:2)
首先,我将简要回答您的问题
如何确保这种情况不再发生?
您可以修复并编写单元测试以防止发生回归的特定缺陷。但是,总的来说,会发生错误。您无法阻止它们,只能缓解它们。使用工具和警告尽早识别它们。通过使用Address Sanitizer,您已经做得很好(还应该查看Undefined Behavior Sanitizer和Thread Sanitizer)。
有没有办法复制它?
Address Sanitizer将在它发生的100%的时间报告它。不幸的是,听起来这取决于您使用的数据。也许尝试一些格式错误的数据以试图诱使它发生。您可以使用各种数据编写单元测试(确保在启用Asan的情况下构建测试)。不能看到代码,不能说更多。
您肯定有一个错误。牙山没有举报误报。听起来这可能只发生在不良数据上,但您永远不要相信自己将永远拥有优质数据。
在不看到代码的情况下帮助您解决问题并不容易。 Asan报告堆栈缓冲区溢出通常是这些事情之一(以我的经验):
如果您通过Xcode运行,则在Asan中止时应会中断。您应该能够查看堆栈跟踪并找到发生在代码中的位置。
尽可能多地打开和打开它们。通常,当您执行诸如引用具有自动存储期限的操作之类的操作时,编译器可能会警告您。
这也是Xcode内置的,可以通过Product -> Analyize
菜单运行。这应该填充在Xcode左列的“问题导航器”中发现的问题。 Clang非常擅长识别内存错误