Ответ 1
Перефразируя 771-BSI (ссылка см. OP):
Способ избежать вызова memset, оптимизированного компилятором, - это снова получить доступ к буфере после вызова memset таким образом, чтобы заставить компилятор не оптимизировать местоположение. Это может быть достигнуто с помощью
*(volatile char*)buffer = *(volatile char*)buffer;
после вызова memset()
.
Фактически вы можете написать функцию secure_memset()
void* secure_memset(void *v, int c, size_t n) {
volatile char *p = v;
while (n--) *p++ = c;
return v;
}
(Код, взятый из 771-BSI. Спасибо Даниэлю Треббиену за указание на возможный недостаток предыдущего предложения кода.)
Почему volatile
предотвращает оптимизацию? См. fooobar.com/questions/64567/...
ОБНОВЛЕНИЕ Также читайте Чувствительные данные в памяти, потому что, если у вас есть противник в вашей системе iOS, вы уже более или менее ввернуты даже до того, как он попытается прочитать эту память. В сводке SecureZeroMemory() или secure_memset() действительно не помогают.