Swift Xcode解决sockaddr的消毒器问题
以下代码用于将Swift Xcode解决sockaddr的消毒器问题,swift,xcode,pointers,address-sanitizer,Swift,Xcode,Pointers,Address Sanitizer,以下代码用于将sockaddr转换为sockaddr\u in6以获取IPv6地址: extension sockaddr { private var addressV6: String { var me = self var buffer = [Int8](repeating: 0, count: Int(INET6_ADDRSTRLEN)) withUnsafePointer(to: &me) { $0.withMemoryRebound(t
sockaddr
转换为sockaddr\u in6
以获取IPv6地址:
extension sockaddr {
private var addressV6: String {
var me = self
var buffer = [Int8](repeating: 0, count: Int(INET6_ADDRSTRLEN))
withUnsafePointer(to: &me) {
$0.withMemoryRebound(to: sockaddr_in6.self, capacity: 1) {
var addrV6 = $0.pointee.sin6_addr
inet_ntop(AF_INET6, &addrV6, &buffer, socklen_t(INET6_ADDRSTRLEN))
}
}
return String(cString: buffer)
}
}
当我使用地址消毒器在Xcode 9 beta中运行代码时,执行会在这一行停止:
var addrV6 = $0.pointee.sin6_addr
带有以下消息(加上大量内存信息):
AddressSanitizer:位于的地址0x000131810077上的堆栈缓冲区溢出
pc 0x00010a3c06d5 bp 0x7fff55ded010 sp 0x7fff55ded008读取大小16
在0x000131810077螺纹T0处
我可以理解ASAN关心的是,我正在读取sockaddr
的边界,以获得完整的sockaddr\u in6
(sockaddr
为16字节,sockaddr\u in6
为28字节)
但由于这个原因,我似乎无法用ASAN测试我的应用程序的其余部分。任何使用with memoryrebound
都会绊倒ASAN,这似乎有点奇怪
我试着用不同的方式编写它,甚至用数据作为字节的容器。但我似乎总能找到一个触发ASAN的解决方案
我的代码有问题吗?
或者我可以在ASAN中忽略此函数吗?由getifaddrs
函数返回的指针看起来像sockaddr
指针,但实际上是指向sockaddr\u in
或sockaddr\u in 6
的指针。通过将addressV6
函数移动到sockaddr
上的扩展,内存被复制并剪切为sockaddr
结构的大小。在IPv6的情况下,有价值的地址信息将丢失
新的(修剪过的)sockaddr
永远无法转换为触发SAN的sockaddr\u in6
有关更多信息,请参阅:
谢谢@MartinR帮我做这件事 你期待什么<代码>结构sockaddr
无法保存IPv6地址请看中的“Socket API Helper”。我相信sockaddr
是一个指向IPv4或IPv6地址相同结构的结构。sa_family
字段定义它是AF_INET(v4)还是AF_INET(v6)。当您知道它是哪一个时,可以将内存强制转换为
中的sockaddr\u或6中的sockaddr\u
。我的代码以返回当前设备的网络接口的getifaddrs
函数开始。每个接口都有一个ifa\u addr
,它是一个sockaddr
,可以是v4或v6地址。在这段C代码中,您可以看到ifa\u addr
如何被解释为sockaddr\u In
或sockaddr\u In 6
(第28行和第35行)。在Swift中,我想不出一种不让ASAN绊倒的方法:C代码投射指针sockaddr_in
是结构本身,而不是指针。这如何转化为Swift代码?谢谢你的帮助。