Swift 使用地址消除器进行调试
所以我试着在启用“地址消毒剂”的情况下运行我们的应用程序。我得到了这个碰撞:Swift 使用地址消除器进行调试,swift,address-sanitizer,Swift,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.ad
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)
让sData=“-e5069fba-3612”。数据(使用:String.Encoding.utf8)!
var pointer=sData.withUnsafeBytes{(字节:UnsafePointer)->中的UnsafePointer
返回字节
}
指针=指针.高级(由:1)
设tmpPIN=String(cString:pointer)
印刷品(tmpPIN)
崩溃指向let tmpPIN=String(cString:pointer)
。有人知道这背后的原因吗?我不明白为什么会这样
注意,当我禁用“地址消毒剂”时,应用程序运行正常。我应该担心还是忽略它?我发现。。。当我添加
sData.append(0)
初始化sData后,地址消毒器错误消失。我发现。。。当我添加sData.append(0)
时,初始化sData之后,地址消毒器错误消失了。看起来你找到了一个有效的答案,但我添加了一个,因为对于这样一个简单的问题,我仍然对如此复杂的代码感到困惑
您的代码:
- 将Swift字符串转换为
对象数据
- 从中获取不安全的字节
- 指针对不安全字节进行数学运算,使其向前移动一个字节
- 最后将结果转换回
李>字符串
let sData = "-e5069fba-3612"
let tmpPIN = sData2.dropFirst()
结果完全一样
或者,您可以在开始时使用以下内容处理多个-
字符
let tmpPIN = sData.drop { $0 == "-" }
对于这个字符串,它给出了相同的结果。看起来你找到了一个有效的答案,但我添加了一个,因为对于这样一个简单的问题,我仍然对如此复杂的代码感到困惑 您的代码:
- 将Swift字符串转换为
对象数据
- 从中获取不安全的字节
- 指针对不安全字节进行数学运算,使其向前移动一个字节
- 最后将结果转换回
李>字符串
let sData = "-e5069fba-3612"
let tmpPIN = sData2.dropFirst()
结果完全一样
或者,您可以在开始时使用以下内容处理多个-
字符
let tmpPIN = sData.drop { $0 == "-" }
这给这个字符串带来了相同的结果。我更感兴趣的问题是,为什么要将
字符串
转换为UTF8,获取不安全的字节,并在最后使用另一个字符串
时使用C样式的字符串初始值设定项。这仅仅是为了从一开始就去掉-
?@TomHarrington谢谢你!第一行实际上不是我们应用程序中的确切代码。我基于我们的代码创建了一个虚拟应用程序,只是为了复制所述错误,我需要虚拟数据
,所以我创建了一个带有所述字符串的应用程序。出于隐私原因,我无法发布我们的确切代码。我更感兴趣的问题是,为什么要将字符串
转换为UTF8,获取不安全的字节,并在最后使用另一个字符串
时使用C样式的字符串初始值设定项。这仅仅是为了从一开始就去掉-
?@TomHarrington谢谢你!第一行实际上不是我们应用程序中的确切代码。我基于我们的代码创建了一个虚拟应用程序,只是为了复制所述错误,我需要虚拟数据
,所以我创建了一个带有所述字符串的应用程序。出于隐私原因,我不能发布我们的确切代码。