Después de actualizar a Swift 5.2 / Xcode 11.4 recibí una advertencia para el siguiente código:
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) }
}
}
En la línea permiten puntero = UnsafeBufferPointer (inicio: & valor, cuentan: 1) Tengo
La inicialización de 'UnsafeBufferPointer' da como resultado un puntero de búfer colgante
Puedo usar @silenceWarning pero es una solución sucia. ¿Quizás necesito almacenar el puntero en algún lugar y limpiarlo en el futuro?
swift
unsafe-pointers
swift5.2
xcode11.4
Exey Panteleev
fuente
fuente
Respuestas:
Esto nunca fue seguro, me alegra que el equipo de Swift lo haya limpiado:
Al final de esta línea de código,
pointer
es inmediatamente inválido. No hay promesa de quevalue
incluso exista en la siguiente línea de código. No estoy seguro de lo que estaba tratando de lograr aquí, pero esta nunca fue una forma segura de hacerlo. Lo que probablemente esté buscando es uno de los.withUnsafeBytes
métodos, que depende de en qué estaba trabajando.fuente
Tenía un código que parecía casi exactamente lo que estabas haciendo y recibía la misma advertencia. La mía difería ligeramente de una manera que es relevante para la discusión
Esto todavía genera la advertencia de que UnsafeBufferPointer está produciendo un puntero colgante, pero las sugerencias dicen "produce un puntero válido solo durante la duración de la llamada a 'init (start: count :)'"
Pero el retorno de UnsafeBufferPointer no está asignado a nada, por lo que no podría usarlo fuera del alcance del init si lo intentara. Entonces el compilador aquí me advierte que no haga algo que no puedo hacer de todos modos.
Supongo que Data.init (buffer:) podría estar almacenando el ptr, pero supongo que si acepta un UnsafeBufferPointer, está aceptando la responsabilidad de usarlo correctamente
De todos modos, eso todavía no soluciona tu problema. Eludí la advertencia con esto
Y esto no genera la advertencia y parece funcionar (en mi aplicación de todos modos). Si pasa reunión con los expertos aquí es otra cuestión.
Algo así me pone nostálgico por los días de HLock y HUnlock
fuente
También me encontré con estas advertencias molestas.
Teniendo en cuenta la respuesta de @ Greg, puse el
Data.append
enwithUnsafePointer
el cierre 's, y no muestra advertencias más.Aquí esta la extensión
fuente
append(.init(value: value))