Parafrasare 771-BSI (link vedi OP):
Un modo per evitare la chiamata memset ottimizzato dal compilatore è di accedere nuovamente buffer dopo la chiamata memset in modo tale da forzare il compilatore non per ottimizzare la posizione. Ciò può essere ottenuto da
*(volatile char*)buffer = *(volatile char*)buffer;
dopo la chiamata memset()
.
In realtà, si potrebbe scrivere una funzione
void* secure_memset(void *v, int c, size_t n) {
volatile char *p = v;
while (n--) *p++ = c;
return v;
}
secure_memset()
(codice preso da 771-BSI. Grazie a Daniel Trebbien per indicare un possibile difetto della proposta di codice precedente.)
Perché volatile
impedisce l'ottimizzazione? Vedere https://stackoverflow.com/a/3604588/220060
UPDATE Si prega di leggere anche Sensitive Data In Memory perché se si dispone di un avversario sul sistema iOS, il tuo sono già più o meno avvitato prima ancora che tenta di leggere che la memoria. In una sintesi SecureZeroMemory() o secure_memset() non sono di grande aiuto.
Ho pensato che forse c'è un equivalente a SecureZeroMemory() in iOS. La tua soluzione sembra buona, ma che ne dite di "La soluzione dovrebbe essere efficace sulla maggior parte delle piattaforme, ma consultare la documentazione della piattaforma per verificare che sia sufficiente fare riferimento a un personaggio in questo modo." – HyBRiD
Penso che questo sia solo con cautela ondeggiando avanti e indietro. È dettato dallo standard che l'accesso alle variabili volatili NON deve essere ottimizzato. In realtà potrebbe essere che l'unico carattere è una porta hardware e un accesso in lettura innesca qualcosa a livello hardware. Con volatile dichiari al compilatore che sai meglio di lui e che non pensa nemmeno di cercare di ottimizzare quell'accesso. E poiché tale accesso dipende dal memset() che lo precede, il memset() non verrà ottimizzato. – nalply
La funzione 'secure_memset' potrebbe non essere sufficiente. Secondo http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1381.pdf ci sono ottimizzatori di compilatori che azzereranno solo il primo byte. –