Re[3]: Обнуление памяти
От: Sergei I. Gorelkin Россия  
Дата: 03.08.05 16:06
Оценка: 1 (1)
Здравствуйте, Macr0s, Вы писали:

M>Здравствуйте, donsergio, Вы писали:


D>>В MSDN подробно описано, чем различаются эти функции.


M>Там написано, что одна может быть опущена оптимизирующим компилятором, а другая — нет. Всё.

M>А почему так происходит?

В хедерах, конечно, сам черт ногу сломит, но если разобраться, то:
ZeroMemory() — это макрос, вызывающий ф-цию memset(), которая для платформы Intel32 объявлена как #pragma intrinsic, т.е. сам компилятор "знает" что с ней делать. В частности, если нужно заполнить область небольшого размера, то он не будет генерировать цикл, дабы быстрее работало. Сгенерит что-то типа

   xor ebx, ebx
   mov [eax], ebx
   mov [eax+4], ebx
   mov [eax+8], ebx


Да еще и раскидает эти инструкции среди других, для оптимальной работы конвейера. Соответственно, при определенных обстоятельствах он может и вообще все выкинуть. Это относится и еще к нескольким подобным функциям.

SecureZeroMemory использует модификатор volatile для указателя на очищаемую память. Это означает, что компилятор не имеет права делать какие-либо предположения о судьбе этой переменной, и поэтому ничего оптимизировать он не будет.
Обнуление памяти
От: Macr0s Россия  
Дата: 03.08.05 11:16
Оценка:
Приветстую всех.
Тут такой вопрос: и что мне дома не сиделось?
Теперь к делу.
Есть такая Win32API функция ZeroMemory. Используется для заполнения блока памяти нулями. Надо понимать, она работает примерно так:
void ZeroMemory(void* mem, size_t len){
    for(int i=0;i<(int)len;i++)
        (BYTE)mem[i]=0;
}

Может я ошибаюсь, но этого вроде как достаточно, чтобы обнулить память.
Так вот а днях случайно наткнулся в MSDN на функцию SecureZeroMemory с точно таким же прототипом.

Внимание вопрос: чем отличается алгоритм работы этой "безопасной" функции от нормальной? Какой смысл был делать 2 разные функции? Кто-нибудь реально ей пользуется?
Перед тем, как улучшиться, ситуация ухудшается. (из законов Мерфи)
Re: Обнуление памяти
От: donsergio  
Дата: 03.08.05 11:30
Оценка:
В MSDN подробно описано, чем различаются эти функции.

ZeroMemory работает не так просто, как ты написал, а еще проще, она обнуляет блок памяти указанного размера, а не по кусочку размера BYTE.
Re[2]: Обнуление памяти
От: Macr0s Россия  
Дата: 03.08.05 11:45
Оценка:
Здравствуйте, donsergio, Вы писали:

D>В MSDN подробно описано, чем различаются эти функции.


Там написано, что одна может быть опущена оптимизирующим компилятором, а другая — нет. Всё.
А почему так происходит?
Скоро выйдут новые компиляторы, которые будут оптимизировать и SecureZeroMemory...
И чем отличается алгоритм работы безопасной функции?
Перед тем, как улучшиться, ситуация ухудшается. (из законов Мерфи)
Re: Обнуление памяти
От: gandalf_g Россия  
Дата: 03.08.05 11:51
Оценка:
Здравствуйте, Macr0s, Вы писали:

M>Приветстую всех.

M>Тут такой вопрос: и что мне дома не сиделось?
M>Теперь к делу.
M>Есть такая Win32API функция ZeroMemory. Используется для заполнения блока памяти нулями. Надо понимать, она работает примерно так:
M>
M>void ZeroMemory(void* mem, size_t len){
M>    for(int i=0;i<(int)len;i++)
M>        (BYTE)mem[i]=0;
M>}
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 >>
Have fun...
Re[3]: Обнуление памяти
От: crackoff Россия  
Дата: 03.08.05 12:04
Оценка:
Здравствуйте, Macr0s, Вы писали:

M>Здравствуйте, donsergio, Вы писали:


D>>В MSDN подробно описано, чем различаются эти функции.


M>Там написано, что одна может быть опущена оптимизирующим компилятором, а другая — нет. Всё.

M>А почему так происходит?
M>Скоро выйдут новые компиляторы, которые будут оптимизировать и SecureZeroMemory...
M>И чем отличается алгоритм работы безопасной функции?

Прошелся отладчиком, SecureZeroMemory вызывает _RtlSecureZeroMemory:

volatile char *vptr = (volatile char *)ptr;
#if defined(_M_AMD64)
        __stosb((PBYTE )((DWORD64)vptr), 0, cnt);
#else
    while (cnt) {
        *vptr = 0;
        vptr++;
        cnt--;
                }

#endif

    return ptr;


ZeroMemory вызывает memset, и тоже нормально обнуляет память.
... << RSDN@Home 1.1.4 beta 6a rev. 436> <под Within Temptation — Ice Queen (Single Edit)>>
Re[2]: Обнуление памяти
От: shurik.  
Дата: 03.08.05 12:53
Оценка:
я тоже хочу в вашу песочницу...

_>

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?
может потому, что пока ещё не знают такой функции?
Re[2]: Обнуление памяти
От: Hydrogen  
Дата: 03.08.05 15:18
Оценка:
Здравствуйте, donsergio, Вы писали:

D>В MSDN подробно описано, чем различаются эти функции.


D>ZeroMemory работает не так просто, как ты написал, а еще проще, она обнуляет блок памяти указанного размера, а не по кусочку размера BYTE.

Что за глупость? Как может быть так, что она сразу "обнуляет блок памяти указанного размера"?
... << RSDN@Home 1.1.3 stable >>
Re[3]: Обнуление памяти
От: gbt Россия  
Дата: 03.08.05 15:46
Оценка:
Hello, Hydrogen, you wrote:

> Здравствуйте, donsergio, Вы писали:


D>>В MSDN подробно описано, чем различаются эти функции.


D>>ZeroMemory работает не так просто, как ты написал, а еще проще, она

D>>обнуляет блок памяти указанного размера, а не по кусочку размера BYTE.
> Что за глупость? Как может быть так, что она сразу "обнуляет блок памяти указанного размера"?

mov ecx, size
xor eax, eax
rep stosd


--
Igor Polyakov — igorpol_gbt (at) mail (dot) ru
Posted via RSDN NNTP Server 1.9
Re[4]: Обнуление памяти
От: Hydrogen  
Дата: 03.08.05 16:03
Оценка:
Здравствуйте, gbt, Вы писали:

gbt>Hello, Hydrogen, you wrote:


>> Здравствуйте, donsergio, Вы писали:


D>>>В MSDN подробно описано, чем различаются эти функции.


D>>>ZeroMemory работает не так просто, как ты написал, а еще проще, она

D>>>обнуляет блок памяти указанного размера, а не по кусочку размера BYTE.
>> Что за глупость? Как может быть так, что она сразу "обнуляет блок памяти указанного размера"?

gbt>
gbt>mov ecx, size
gbt>xor eax, eax
gbt>rep stosd
gbt>

Пфф.. кусочками по 4 байт... Все равно кусочками.
И потом, никто ведь так уже не делает. rep stosd — это старо.
... << RSDN@Home 1.1.3 stable >>
Re[5]: Обнуление памяти
От: gbt Россия  
Дата: 03.08.05 16:09
Оценка:
Hello, Hydrogen, you wrote:

D>>>>ZeroMemory работает не так просто, как ты написал, а еще проще, она

D>>>>обнуляет блок памяти указанного размера, а не по кусочку размера BYTE.
>>> Что за глупость? Как может быть так, что она сразу "обнуляет блок памяти указанного размера"?

gbt>>
gbt>>mov ecx, size
gbt>>xor eax, eax
gbt>>rep stosd
gbt>>

> Пфф.. кусочками по 4 байт... Все равно кусочками.
> И потом, никто ведь так уже не делает. rep stosd — это старо.
Что вы понимаете под кусочкамми ? Если брать во внимание устройство кэша и
ширину шины, то тут размер куочков становится расплывчатым...

--
Igor Polyakov — igorpol_gbt (at) mail (dot) ru
Posted via RSDN NNTP Server 1.9
Re[6]: Обнуление памяти
От: Hydrogen  
Дата: 04.08.05 08:11
Оценка:
Здравствуйте, gbt, Вы писали:

gbt>Hello, Hydrogen, you wrote:


D>>>>>ZeroMemory работает не так просто, как ты написал, а еще проще, она

D>>>>>обнуляет блок памяти указанного размера, а не по кусочку размера BYTE.
>>>> Что за глупость? Как может быть так, что она сразу "обнуляет блок памяти указанного размера"?
gbt>Что вы понимаете под кусочкамми ? Если брать во внимание устройство кэша и
gbt>ширину шины, то тут размер куочков становится расплывчатым...
Ладно, сворачиваем, зашли в область терминологическио-философских споров.
... << RSDN@Home 1.1.3 stable >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.