Перефразируя 771-BSI (ссылка см. В ОП):
Чтобы избежать оптимизации вызова 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
препятствует оптимизации?См. https://stackoverflow.com/a/3604588/220060
ОБНОВЛЕНИЕ Пожалуйста, прочитайте также Конфиденциальные данные в памяти , потому что если у вас есть злоумышленник в вашей системе iOS, вы уже более или менее облажались даже раньшеон пытается прочитать эту память.В итоге SecureZeroMemory () или secure_memset () не очень помогают.