Приветстую всех.
Тут такой вопрос: и что мне дома не сиделось?
Теперь к делу.
Есть такая Win32API функция ZeroMemory. Используется для заполнения блока памяти нулями. Надо понимать, она работает примерно так:
Может я ошибаюсь, но этого вроде как достаточно, чтобы обнулить память.
Так вот а днях случайно наткнулся в MSDN на функцию SecureZeroMemory с точно таким же прототипом.
Внимание вопрос: чем отличается алгоритм работы этой "безопасной" функции от нормальной? Какой смысл был делать 2 разные функции? Кто-нибудь реально ей пользуется?
Перед тем, как улучшиться, ситуация ухудшается. (из законов Мерфи)
Здравствуйте, donsergio, Вы писали:
D>В MSDN подробно описано, чем различаются эти функции.
Там написано, что одна может быть опущена оптимизирующим компилятором, а другая — нет. Всё.
А почему так происходит?
Скоро выйдут новые компиляторы, которые будут оптимизировать и SecureZeroMemory...
И чем отличается алгоритм работы безопасной функции?
Перед тем, как улучшиться, ситуация ухудшается. (из законов Мерфи)
Здравствуйте, Macr0s, Вы писали:
M>Приветстую всех. M>Тут такой вопрос: и что мне дома не сиделось? M>Теперь к делу. M>Есть такая Win32API функция ZeroMemory. Используется для заполнения блока памяти нулями. Надо понимать, она работает примерно так: M>
M>Может я ошибаюсь, но этого вроде как достаточно, чтобы обнулить память. M>Так вот а днях случайно наткнулся в MSDN на функцию SecureZeroMemory с точно таким же прототипом.
M>Внимание вопрос: чем отличается алгоритм работы этой "безопасной" функции от нормальной? Какой смысл был делать 2 разные функции? Кто-нибудь реально ей пользуется?
Use this function instead of ZeroMemory when you want to ensure that your data will be overwritten promptly, as the compiler can optimize a call to ZeroMemory by removing it entirely. A call to SecureZeroMemory will not be optimized.
MSDN (SecureZeroMemory), там же пример, почему стоит пользоваться безопасной версией
... << RSDN@Home 1.1.4 stable SR1 rev. 568 >>
... << Now Playing: john b — krisptron >>
Здравствуйте, Macr0s, Вы писали:
M>Здравствуйте, donsergio, Вы писали:
D>>В MSDN подробно описано, чем различаются эти функции.
M>Там написано, что одна может быть опущена оптимизирующим компилятором, а другая — нет. Всё. M>А почему так происходит? M>Скоро выйдут новые компиляторы, которые будут оптимизировать и SecureZeroMemory... M>И чем отличается алгоритм работы безопасной функции?
Прошелся отладчиком, SecureZeroMemory вызывает _RtlSecureZeroMemory:
Use this function instead of ZeroMemory when you want to ensure that your data will be overwritten promptly, as the compiler can optimize a call to ZeroMemory by removing it entirely. A call to SecureZeroMemory will not be optimized.
что-то непонятно
как это оптимизатор полностью может убрать вызов функции, если переданный ей массив далее не используется? какая ему разница что эта функция с этим массивом делает? (так я понял то, что написано в MSDN)?
и почему он не "оптимизирует" вызов SecureZeroMemory?
Re[3]: Обнуление памяти
От:
Аноним
Дата:
03.08.05 12:56
Оценка:
Здравствуйте, shurik., Вы писали:
S>я тоже хочу в вашу песочницу...
Вэлкам! S>и почему он не "оптимизирует" вызов SecureZeroMemory?
может потому, что пока ещё не знают такой функции?
Здравствуйте, donsergio, Вы писали:
D>В MSDN подробно описано, чем различаются эти функции.
D>ZeroMemory работает не так просто, как ты написал, а еще проще, она обнуляет блок памяти указанного размера, а не по кусочку размера BYTE.
Что за глупость? Как может быть так, что она сразу "обнуляет блок памяти указанного размера"?
Hello, Hydrogen, you wrote:
> Здравствуйте, donsergio, Вы писали:
D>>В MSDN подробно описано, чем различаются эти функции.
D>>ZeroMemory работает не так просто, как ты написал, а еще проще, она D>>обнуляет блок памяти указанного размера, а не по кусочку размера BYTE. > Что за глупость? Как может быть так, что она сразу "обнуляет блок памяти указанного размера"?
Здравствуйте, gbt, Вы писали:
gbt>Hello, Hydrogen, you wrote:
>> Здравствуйте, donsergio, Вы писали:
D>>>В MSDN подробно описано, чем различаются эти функции.
D>>>ZeroMemory работает не так просто, как ты написал, а еще проще, она D>>>обнуляет блок памяти указанного размера, а не по кусочку размера BYTE. >> Что за глупость? Как может быть так, что она сразу "обнуляет блок памяти указанного размера"?
gbt>
Здравствуйте, Macr0s, Вы писали:
M>Здравствуйте, donsergio, Вы писали:
D>>В MSDN подробно описано, чем различаются эти функции.
M>Там написано, что одна может быть опущена оптимизирующим компилятором, а другая — нет. Всё. M>А почему так происходит?
В хедерах, конечно, сам черт ногу сломит, но если разобраться, то:
ZeroMemory() — это макрос, вызывающий ф-цию memset(), которая для платформы Intel32 объявлена как #pragma intrinsic, т.е. сам компилятор "знает" что с ней делать. В частности, если нужно заполнить область небольшого размера, то он не будет генерировать цикл, дабы быстрее работало. Сгенерит что-то типа
Да еще и раскидает эти инструкции среди других, для оптимальной работы конвейера. Соответственно, при определенных обстоятельствах он может и вообще все выкинуть. Это относится и еще к нескольким подобным функциям.
SecureZeroMemory использует модификатор volatile для указателя на очищаемую память. Это означает, что компилятор не имеет права делать какие-либо предположения о судьбе этой переменной, и поэтому ничего оптимизировать он не будет.
Hello, Hydrogen, you wrote:
D>>>>ZeroMemory работает не так просто, как ты написал, а еще проще, она D>>>>обнуляет блок памяти указанного размера, а не по кусочку размера BYTE. >>> Что за глупость? Как может быть так, что она сразу "обнуляет блок памяти указанного размера"?
gbt>>
> Пфф.. кусочками по 4 байт... Все равно кусочками. > И потом, никто ведь так уже не делает. rep stosd — это старо.
Что вы понимаете под кусочкамми ? Если брать во внимание устройство кэша и
ширину шины, то тут размер куочков становится расплывчатым...
Здравствуйте, gbt, Вы писали:
gbt>Hello, Hydrogen, you wrote:
D>>>>>ZeroMemory работает не так просто, как ты написал, а еще проще, она D>>>>>обнуляет блок памяти указанного размера, а не по кусочку размера BYTE. >>>> Что за глупость? Как может быть так, что она сразу "обнуляет блок памяти указанного размера"? gbt>Что вы понимаете под кусочкамми ? Если брать во внимание устройство кэша и gbt>ширину шины, то тут размер куочков становится расплывчатым...
Ладно, сворачиваем, зашли в область терминологическио-философских споров.