使用 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=] == "-" }
对于这个字符串给出相同的结果。
所以我尝试 运行 我们的应用启用了 "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.append(0)
时,Address Sanitizer 错误消失了。
您似乎找到了一个可行的答案,但我添加了一个,因为我仍然对如此简单的问题的如此复杂的代码感到困惑。
您的代码:
- 将 Swift 字符串转换为
Data
对象, - 从中获取不安全字节
- 对不安全字节进行指针运算以向前移动一个字节,
- 最终将结果转换回
String
。
你的修复通过附加一个你甚至不想要的额外字节使它变得更加复杂(它起作用是因为 C 字符串应该在末尾有一个空字符,而你的修复添加了那个)。
这可以更简单地完成:
let sData = "-e5069fba-3612"
let tmpPIN = sData2.dropFirst()
结果完全一样
或者您可以在开头处理多个 -
个字符,例如
let tmpPIN = sData.drop { [=11=] == "-" }
对于这个字符串给出相同的结果。