সতর্কতা: 'অনিরাপদ বাফারপয়েন্টার <T>' এর প্রারম্ভিক ফলস্বরূপ ঝোলা বাফার পয়েন্টার


10

সুইফট 5.2 / এক্সকোড 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) পেয়েছি

'অনিরাপদ বাফারপয়েন্টার' এর সূচনার ফলে ঝনঝন বাফার পয়েন্টার আসে

আমি @ সাইলেন্স ওয়ার্নিং ব্যবহার করতে পারি তবে এটি নোংরা সমাধান। হয়তো আমার কোথাও পয়েন্টার সঞ্চয় করতে হবে এবং ভবিষ্যতে এটি পরিষ্কার করতে হবে?


রিলিজ নোটগুলি পড়ার বিরক্ত না করে সকলেই কীভাবে আপডেট করতে ছুটে যায় তা এই বিষয়গুলি থেকে বেশ স্পষ্ট It's
ম্যাট

বিকাশকারী.অ্যাপল .com/ ডকুমেন্টেশন / এক্সকোড_রেইজ_নোটস / and এবং নাচের জন্য অনুসন্ধান করুন। bugs.swift.org/browse/SR-2790 এর আরও একটি সম্পূর্ণ আলোচনা হয়েছে বলে মনে হয়।
রায় ফালক

উত্তর:


3

এটি কখনই নিরাপদ ছিল না, তাই সুইফট দল এটি পরিষ্কার করে দিয়েছে বলে আনন্দিত:

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

কোডের এই লাইনের শেষে, pointerঅবিলম্বে অবৈধ। এমন কোনও প্রতিশ্রুতি নেই যে valueকোডের পরবর্তী লাইনেও রয়েছে। আপনি এখানে কী অর্জন করার চেষ্টা করছেন তা আমি নিশ্চিত নই, তবে এটি করার পক্ষে এটি কোনও নিরাপদ উপায় ছিল না। আপনি সম্ভবত যা খুঁজছেন তা হ'ল একটি .withUnsafeBytesপদ্ধতি যা আপনি কী কাজ করছেন তার উপর নির্ভর করে।


3
যদিও আপনার উত্তরটি সম্ভবত সঠিক, আপনি কীভাবে এটি ব্যর্থ হতে পারে তার উদাহরণ দেখালে এটি আরও ভাল। অনিরাপদ * পয়েন্টার যে চারপাশে ভাসমান usingালাই এবং রূপান্তরগুলির কয়েকটি উদাহরণ ( স্ট্যাকওভারফ্লো.com/ a/ 27456220 / 5276890 ) রয়েছে যা এখন এই সতর্কতা তৈরি করে।
রায় ফালক

3

আমার কাছে এমন কোড ছিল যা দেখে আপনি ঠিক কী করছিলেন এবং একই সতর্কতা পেয়ে যাচ্ছিল। আমার আলোচনার সাথে প্রাসঙ্গিকভাবে কিছুটা পৃথক হয়েছিল

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

এটি এখনও সতর্কতা উত্পন্ন করে যে অনিরাপদ-বাফারপয়েন্টার একটি জটলা পয়েন্টার তৈরি করছে তবে ইঙ্গিতগুলি বলে যে "কলটি 'আরম্ভের জন্য কেবলমাত্র পয়েন্টার বৈধ করে (শুরু: গণনা :)'"

তবে আনসাফফুফারপয়েন্টার থেকে রিটার্নটি কোনও কিছুর জন্য বরাদ্দ করা হয়নি, তাই আমি চেষ্টা করে থাকলে আমি এটির উদ্যোগের বাইরে ব্যবহার করতে পারিনি। সুতরাং এখানে সংকলক আমাকে এমন কিছু করার বিরুদ্ধে সতর্ক করছে যা আমি যাইহোক করতে পারি না।

আমি অনুমান করি যে Data.init (বাফার:) পিটিআর সংরক্ষণ করতে পারে তবে আমি ধরে নেব যে এটি যদি কোনও অনিরাপদবাফারপয়েন্টার গ্রহণ করে তবে এটি সঠিকভাবে ব্যবহারের জন্য দায় স্বীকার করছে

যাইহোক, এটি এখনও আপনার সমস্যার সমাধান করে না। আমি এই সঙ্গে সতর্কতা কাছাকাছি পেয়েছিলাম

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))
লিও ডাবাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.