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