¿Cuál es la forma correcta de borrar datos confidenciales de la memory en iOS?

Quiero borrar datos confidenciales de la memory en mi aplicación iOS. En Windows solía usar SecureZeroMemory. Ahora, en iOS, uso memory antigua simple, pero estoy un poco preocupado de que el comstackdor pueda optimizarlo: https://buildsecurityin.us-cert.gov/bsi/articles/knowledge/coding/771-BSI.html

fragment de código:

NSData *someSensitiveData; memset((void *)someSensitiveData.bytes, 0, someSensitiveData.length); 

Parafrasear 771-BSI (enlace ver OP):

Una forma de evitar tener la llamada de set de memory optimizada por el comstackdor es acceder nuevamente al búfer después de la llamada de set de memset de una manera que forzaría al comstackdor a no optimizar la location. Esto se puede lograr

 *(volatile char*)buffer = *(volatile char*)buffer; 

después de la llamada de memset() .

De hecho, podría escribir una function secure_memset()

 void* secure_memset(void *v, int c, size_t n) { volatile char *p = v; while (n--) *p++ = c; return v; } 

(Código tomado de 771-BSI. Gracias a Daniel Trebbien por señalar un posible defecto de la propuesta anterior del código).

¿Por qué la volatile impide la optimization? Ver https://stackoverflow.com/a/3604588/220060

ACTUALIZACIÓN También lea los datos sensibles en la memory porque si tiene un adversario en su sistema iOS, ya está más o less atornillado incluso antes de que intente leer esa memory. En un resumen, SecureZeroMemory () o secure_memset () realmente no ayudan.

El problema es NSData es inmutable y no tienes control sobre lo que sucede. Si el buffer está controlado por usted, puede usar dataWithBytesNoCopy: length: y NSData actuará como un contenedor. Cuando termines, puedes memorizar tu búfer.