scodeaddr的Xcode Address Sanitizer问题

时间:2017-06-08 04:55:36

标签: swift xcode pointers address-sanitizer

以下代码用于将sockaddr转换为sockaddr_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)
  }
}

当我使用Address Sanitizer运行Xcode 9 beta中的代码时,执行将在此行停止:

var addrV6 = $0.pointee.sin6_addr

使用以下消息(加上大量内存信息):

  

AddressSanitizer:地址0x000131810077处的堆栈缓冲区溢出   pc 0x00010a3c06d5 bp 0x7fff55ded010 sp 0x7fff55ded008读取大小16   在0x000131810077线程T0

我可以理解,ASAN担心我正在阅读sockaddr的边界以获得完整的sockaddr_in6sockaddr是16个字节,{{1是28个字节)。

但是由于这个原因,我似乎无法用ASAN测试我的应用程序的其余部分。使用sockaddr_in6会使ASAN绊倒似乎有点奇怪。

我尝试以不同的方式编写它,甚至使用withMemoryRebound作为字节的烦恼。但我似乎总是找到触发ASAN的解决方案。

我的代码有问题吗?
或者我可以在ASAN中以某种方式忽略此功能吗?

1 个答案:

答案 0 :(得分:0)

getifaddrs函数返回的指针看起来像sockaddr指针,但实际上是指向sockaddr_insockaddr_in6的指针。通过将addressV6函数移动到sockaddr上的扩展名,内存被复制并剪切为sockaddr结构的大小。如果是IPv6,有价值的地址信息就会丢失。

新的(裁剪的)sockaddr永远无法转换为触发SAN的sockaddr_in6

有关更多信息,请参阅: Swift getnameinfo unreliable results for IPv6

感谢@MartinR帮我解决这个问题!