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代码?谢谢你的帮助。