चेतावनी: 'UnsafeBufferPointer <T>' के प्रारंभ में झूलने वाले बफर पॉइंटर का परिणाम है


10

स्विफ्ट 5.2 / Xcode 11.4 के अपडेट के बाद निम्नलिखित कोड के लिए एक चेतावनी मिली:

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) }
    }
}

ऑन लाईन पॉइंटर = अनसेफबफ़रपॉइंटर (स्टार्ट: एंड वैल्यू, काउंट: 1) मुझे मिला

'UnsafeBufferPointer' के प्रारंभ में झूलने वाले बफर पॉइंटर का परिणाम है

मैं @silenceWarning का उपयोग कर सकता हूं लेकिन यह गंदा समाधान है। शायद मुझे सूचक को कहीं स्टोर करने और भविष्य में इसे साफ करने की आवश्यकता है?


यह अजीब है कि हर कोई रिलीज़ नोट्स को पढ़ने के लिए परेशान किए बिना कैसे अपडेट करता है, जो इस बारे में काफी स्पष्ट हैं।
मैट

developer.apple.com/documentation/xcode_release_notes/… और danling के लिए खोजें। Bugs.swift.org/browse/SR-2790 में इसके बारे में अधिक चर्चा की गई है।
रॉय फॉक

जवाबों:


3

यह कभी सुरक्षित नहीं था, इसलिए बहुत खुशी हुई कि स्विफ्ट टीम ने इसे साफ कर दिया है:

let pointer = UnsafeBufferPointer(start: &value, count: 1)

कोड की इस पंक्ति के अंत में, pointerतुरंत अमान्य है। ऐसा वादा नहीं है कि valueकोड की अगली पंक्ति में भी मौजूद है। मुझे यकीन नहीं है कि आप यहां क्या हासिल करने की कोशिश कर रहे थे, लेकिन यह ऐसा करने का एक सुरक्षित तरीका नहीं था। आप .withUnsafeBytesजिस चीज की तलाश कर रहे हैं, वह एक तरीका है, जो इस बात पर निर्भर करता है कि आप क्या काम कर रहे थे।


3
जबकि आपका उत्तर शायद सही है, यह बेहतर होगा यदि आपने एक उदाहरण दिखाया कि यह कैसे विफल हो सकता है। Unsafe * सूचक का उपयोग करके कास्टिंग और रूपांतरणों के कुछ उदाहरण ( stackoverflow.com/a/27456220/5276890 ) हैं जो अब इस चेतावनी को उत्पन्न करते हैं।
रॉय फॉक

3

मेरे पास कोड था जो लगभग वही दिख रहा था जो आप कर रहे थे और वही चेतावनी मिल रही थी। मेरा तरीका थोड़ा अलग था जो चर्चा के लिए प्रासंगिक है

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

यह अभी भी चेतावनी उत्पन्न करता है कि UnsafeBufferPointer एक झूलने वाला सूचक उत्पन्न कर रहा है, लेकिन संकेत कहते हैं "कॉल करने की अवधि के लिए केवल एक पॉइंटर वैध बनाता है (प्रारंभ: गिनती :) '"

लेकिन UnsafeBufferPointer से वापसी को कुछ भी नहीं सौंपा गया है, इसलिए अगर मैंने कोशिश की तो मैं इसे इनिट के दायरे से बाहर इस्तेमाल नहीं कर सकता। तो यहाँ संकलक मुझे कुछ करने के खिलाफ चेतावनी दे रहा है जो मैं वैसे भी नहीं कर सकता।

मुझे लगता है कि Data.init (बफ़र): ptr को स्टोर कर सकता है, लेकिन मुझे लगता है कि अगर यह एक UnsafeBufferPointer को स्वीकार करता है, तो यह इसे ठीक से उपयोग करने की जिम्मेदारी स्वीकार कर रहा है

वैसे भी, यह अभी भी वास्तव में आपकी समस्या को ठीक नहीं करता है। मुझे इसके साथ चेतावनी मिली

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 के दिनों के लिए उदासीन बनाता है


3

मैं इन कष्टप्रद चेतावनियों से भी मिला।

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)) 

को ध्यान में रखते @ ग्रेग के जवाब, मैं डाल Data.appendमें withUnsafePointerहै बंद है, और यह अब और चेतावनी प्रदर्शित नहीं करता है।

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

यहाँ विस्तार है

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))
        }
    }
}

DRYappend(.init(value: value))
लियो डबस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.