Après la mise à jour vers Swift 5.2 / Xcode 11.4, un avertissement a été envoyé au code suivant:
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) }
}
}
On line let pointer = UnsafeBufferPointer (start: & value, count: 1) I got
L'initialisation de «UnsafeBufferPointer» entraîne un pointeur de tampon pendant
Je peux utiliser @silenceWarning mais c'est une sale solution. Peut-être que je dois stocker le pointeur quelque part et le nettoyer à l'avenir?
swift
unsafe-pointers
swift5.2
xcode11.4
Exey Panteleev
la source
la source
Réponses:
Cela n'a jamais été sûr, si heureux que l'équipe Swift l'ait nettoyé:
À la fin de cette ligne de code,
pointer
est immédiatement invalide. Il n'y a aucune promesse quivalue
existe même à la prochaine ligne de code. Je ne sais pas ce que vous tentiez de réaliser ici, mais ce n'était jamais un moyen sûr de le faire. Ce que vous recherchez probablement est l'une des.withUnsafeBytes
méthodes, qui dépend de ce sur quoi vous travailliez.la source
J'avais un code qui ressemblait presque exactement à ce que vous faisiez et recevait le même avertissement. Le mien différait légèrement d'une manière pertinente pour la discussion
Cela génère toujours l'avertissement que UnsafeBufferPointer produit un pointeur suspendu, mais les conseils indiquent "produit un pointeur valide uniquement pour la durée de l'appel à" init (start: count :) ""
Mais le retour de UnsafeBufferPointer n'est affecté à rien, donc je ne pourrais pas l'utiliser en dehors de la portée de l'initialisation si j'essayais. Donc, le compilateur ici m'avertit de ne pas faire quelque chose que je ne peux pas faire de toute façon.
Je suppose que Data.init (buffer:) pourrait stocker le ptr, mais je suppose que s'il accepte un UnsafeBufferPointer, il accepte la responsabilité de l'utiliser correctement
Quoi qu'il en soit, cela ne résout toujours pas vraiment votre problème. J'ai contourné l'avertissement avec ça
Et cela ne génère pas l'avertissement et semble fonctionner (dans mon application de toute façon). Que cela passe avec les experts ici est une autre question.
Cela me rend nostalgique des jours de HLock et HUnlock
la source
J'ai également rencontré ces avertissements ennuyeux.
Considérant @ la réponse de greg, je mets le
Data.append
danswithUnsafePointer
la fermeture « , et il ne montre pas les avertissements plus.Voici l'extension
la source
append(.init(value: value))