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字符串转换为
    数据
    对象
  • 从中获取不安全的字节
  • 指针对不安全字节进行数学运算,使其向前移动一个字节
  • 最后将结果转换回
    字符串
您的修复程序通过附加一个您甚至不想要的额外字节使它变得更加复杂(它可以工作,因为C字符串的末尾应该有一个空字符,而您的修复程序会添加这个空字符)

这可以简单得多,因为:

let sData = "-e5069fba-3612"
let tmpPIN = sData2.dropFirst()
结果完全一样

或者,您可以在开始时使用以下内容处理多个
-
字符

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

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

看起来你找到了一个有效的答案,但我添加了一个,因为对于这样一个简单的问题,我仍然对如此复杂的代码感到困惑

您的代码:

  • 将Swift字符串转换为
    数据
    对象
  • 从中获取不安全的字节
  • 指针对不安全字节进行数学运算,使其向前移动一个字节
  • 最后将结果转换回
    字符串
您的修复程序通过附加一个您甚至不想要的额外字节使它变得更加复杂(它可以工作,因为C字符串的末尾应该有一个空字符,而您的修复程序会添加这个空字符)

这可以简单得多,因为:

let sData = "-e5069fba-3612"
let tmpPIN = sData2.dropFirst()
结果完全一样

或者,您可以在开始时使用以下内容处理多个
-
字符

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

这给这个字符串带来了相同的结果。

我更感兴趣的问题是,为什么要将
字符串
转换为UTF8,获取不安全的字节,并在最后使用另一个
字符串
时使用C样式的字符串初始值设定项。这仅仅是为了从一开始就去掉
-
?@TomHarrington谢谢你!第一行实际上不是我们应用程序中的确切代码。我基于我们的代码创建了一个虚拟应用程序,只是为了复制所述错误,我需要虚拟
数据
,所以我创建了一个带有所述
字符串的应用程序。出于隐私原因,我无法发布我们的确切代码。我更感兴趣的问题是,为什么要将
字符串
转换为UTF8,获取不安全的字节,并在最后使用另一个
字符串
时使用C样式的字符串初始值设定项。这仅仅是为了从一开始就去掉
-
?@TomHarrington谢谢你!第一行实际上不是我们应用程序中的确切代码。我基于我们的代码创建了一个虚拟应用程序,只是为了复制所述错误,我需要虚拟
数据
,所以我创建了一个带有所述
字符串的应用程序。出于隐私原因,我不能发布我们的确切代码。