使用Address Sanitizer进行调试

时间:2018-03-27 03:25:51

标签: swift 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”时,应用程序运行正常。我应该担心这个还是忽略它?

2 个答案:

答案 0 :(得分:2)

似乎你找到了一个有效的答案,但我正在添加一个,因为我仍然对这样一个简单问题的复杂代码感到困惑。

您的代码:

  • 将Swift字符串转换为Data对象
  • 获取不安全的字节
  • 指针数学在不安全的字节上向前移动一个字节,
  • 最后将结果转换回String

你的修补程序通过附加一个你甚至不想要的额外字节使它变得更加复杂(它起作用,因为C字符串最后会有一个空字符,而你的修补程序会添加它)。

这可以更简单地完成:

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

结果完全一样。

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

let tmpPIN = sData.drop { $0 == "-" }

这为此字符串提供了相同的结果。

答案 1 :(得分:0)

我找到了this thread ...当我初始化sData后添加sData.append(0)时,地址清理程序错误就消失了。