首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >警告:初始化“UnsafeBufferPointer<T>”将导致缓冲区指针悬空

警告:初始化“UnsafeBufferPointer<T>”将导致缓冲区指针悬空
EN

Stack Overflow用户
提问于 2020-03-25 21:38:43
回答 6查看 10.4K关注 0票数 37

在更新SWIFT5.2/ Xcode 11.4之后,对以下代码发出了警告:

代码语言:javascript
复制
extension Data {

    init<T>(from value: T) {
        var value = value
        let pointer = UnsafeBufferPointer(start: &value, count: 1)
        self.init(buffer: pointer)
    }

    func to<T>(type: T.Type) -> T {
        return self.withUnsafeBytes { $0.load(as: T.self) }
    }
}

在线让指针=UnsafeBufferPointer(开始:&值,计数: 1)

初始化“UnsafeBufferPointer”会导致缓冲区指针悬空

我可以使用@silenceWarning,但它是肮脏的解决方案。也许我需要在某个地方储存指针,然后在将来清理它?

EN

回答 6

Stack Overflow用户

发布于 2020-04-08 08:00:59

我也遇到了这些恼人的警告。

代码语言:javascript
复制
var str = "aaaaabbbbbccccc"
var num1 = 1
var num2 = 22

var data = Data()
// Initialization of 'UnsafeBufferPointer<String>' results in a dangling buffer pointer
data.append(UnsafeBufferPointer(start: &str, count: 1)) 
// Initialization of 'UnsafeBufferPointer<Int>' results in a dangling buffer pointer
data.append(UnsafeBufferPointer(start: &num1, count: 1))
// Initialization of 'UnsafeBufferPointer<Int>' results in a dangling buffer pointer 
data.append(UnsafeBufferPointer(start: &num2, count: 1)) 

考虑到@greg的回答,我把Data.append放到了withUnsafePointer的封闭中,它不再显示警告了。

代码语言:javascript
复制
withUnsafePointer(to: &str) { data.append(UnsafeBufferPointer(start: $0, count: 1)) } // ok
withUnsafePointer(to: &num1) { data.append(UnsafeBufferPointer(start: $0, count: 1)) } // ok
withUnsafePointer(to: &num2) { data.append(UnsafeBufferPointer(start: $0, count: 1)) } // ok

这是分机

代码语言:javascript
复制
extension Data {
    init<T>(value: T) {
        self = withUnsafePointer(to: value) { (ptr: UnsafePointer<T>) -> Data in
            return Data(buffer: UnsafeBufferPointer(start: ptr, count: 1))
        }
    }

    mutating func append<T>(value: T) {
        withUnsafePointer(to: value) { (ptr: UnsafePointer<T>) in
            append(UnsafeBufferPointer(start: ptr, count: 1))
        }
    }
}
票数 19
EN

Stack Overflow用户

发布于 2020-03-31 16:26:35

我的代码看上去几乎和你在做的一样,并且收到了同样的警告。我的意见略有不同,与讨论有关。

代码语言:javascript
复制
init<T>(from value: T) {
    var value = value
    self.init(buffer: UnsafeBufferPointer(start: &value, count: 1))
}

这仍然会生成UnsafeBufferPointer正在生成一个悬空指针的警告,但是提示说“生成的指针仅在调用‘init(start:count:)’时才有效。”

但是UnsafeBufferPointer的返回没有分配给任何东西,所以如果我尝试,就不能在init的范围之外使用它。所以这里的编译器警告我不要做一些我无论如何都做不到的事情。

我猜Data.init(buffer:)可能在存储ptr,但我认为如果它接受一个UnsafeBufferPointer,它就承担了正确使用它的责任

不管怎样,这仍然不能解决你的问题。我用这个绕开了警告

代码语言:javascript
复制
init<T>(from value: T) {
    var value = value
    var myData = Data()
    withUnsafePointer(to:&value, { (ptr: UnsafePointer<T>) -> Void in
        myData = Data( buffer: UnsafeBufferPointer(start: ptr, count: 1))
    })
    self.init(myData)
}

这并不会生成警告,而且看起来很有效(反正在我的应用程序中)。能否与这里的专家会聚是另一回事。

有点让我怀念HLock和HUnlock的日子

票数 12
EN

Stack Overflow用户

发布于 2020-03-25 21:43:25

这从来都不是安全的,很高兴斯威夫特团队已经清理了它:

代码语言:javascript
复制
let pointer = UnsafeBufferPointer(start: &value, count: 1)

在这一行代码的末尾,pointer立即无效。没有承诺value甚至存在于下一行代码中。我不知道你在这里想要实现什么,但这从来不是一个安全的方法。您可能要寻找的是.withUnsafeBytes方法之一,这取决于您在做什么。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60857760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档