使用 Address Sanitizer 进行调试

Debugging with Address Sanitizer

所以我尝试 运行 我们的应用启用了 "Address Sanitizer"。我遇到了这个崩溃:

let sData = "-e5069fba-3612".data(using:String.Encoding.utf8)!
var pointer = sData.withUnsafeBytes {(bytes: UnsafePointer<CChar>) -> UnsafePointer<CChar> in
    return bytes
}
pointer = pointer.advanced(by: 1)
let tmpPIN = String(cString: pointer)
print(tmpPIN)

崩溃指向 let tmpPIN = String(cString: pointer)。有谁知道这背后的原因?我不明白为什么会这样。

请注意,当我禁用 "Address Sanitizer" 时,应用程序运行正常。我应该担心这个还是忽略它?

我发现 ...当我在初始化 sData 后添加 sData.append(0) 时,Address Sanitizer 错误消失了。

您似乎找到了一个可行的答案,但我添加了一个,因为我仍然对如此简单的问题的如此复杂的代码感到困惑。

您的代码:

  • 将 Swift 字符串转换为 Data 对象,
  • 从中获取不安全字节
  • 对不安全字节进行指针运算以向前移动一个字节,
  • 最终将结果转换回 String

你的修复通过附加一个你甚至不想要的额外字节使它变得更加复杂(它起作用是因为 C 字符串应该在末尾有一个空字符,而你的修复添加了那个)。

这可以更简单地完成:

let sData = "-e5069fba-3612"
let tmpPIN = sData2.dropFirst()

结果完全一样

或者您可以在开头处理多个 - 个字符,例如

let tmpPIN = sData.drop { [=11=] == "-" }

对于这个字符串给出相同的结果。