Whats the frequency of the letter a in:
Q: Затирание освобождённой памяти Пишу некое приложение, которое работает с конфиденциальными (для меня) данными. Хочу чтобы, в идеале, после его работы в памяти не оставалось хвостов от этих данных.
В связи с этим возникла мысль: как известно, процедура SetLength() при увеличении размера строки/массива может выделить под него новый блок памяти и скопировать туда данные из старого, если ей не хватает места под новый размер в старом расположении.
Ну и собственно вопрос: возможно ли использовать такую обёртку (см. комментарий)?
procedure SecureResize(var Data: TBytes; NewSize: Integer);
var
  OldPtr: Pointer;
  OldSize: Integer;
begin
  OldPtr := Pointer(Data);
  OldSize := Length(Data);
  SetLength(Data, NewSize);
  if (OldSize < NewSize) and (OldPtr <> Pointer(Data)) then 
  begin {
      Данные были перемещены, поэтому необходимо затереть их в старой
      локации. Формально, OldPtr указывает на свободный участок памяти, 
      но может ли его за это время занять другой процесс или можно
      гарантировать что в этом месте он ещё никем не занят и спокойно 
      затереть данные?.. }
    FillChar(OldPtr^, OldSize, 0);
  end else if OldSize > NewSize then
    FillChar(Data[NewSize], OldSize - NewSize, 0);
end;


A: В такой обёртке есть вероятность AV, так как старые страницы могут уже быть MEM_RELEASE.
Можно просто создать новый массив-копию и после подчистить старый.
procedure SecureResize(var Data: TBytes; Len: Integer);
var
  NewData : TBytes;
begin
  SetLength(NewData, Len);
  if ( Len > Length(Data) )
    then Len := Length(Data);
  if ( Len > 0 ) then begin
    Move(Data[0], NewData[0], Len);
    FillChar(Data[0], Length(Data), $00);
  end;
  Data := NewData;
end;

Но, думаю, конструктивнее создать для таких данных (инкапсулировать их в) класс,
в котором переопределить FreeInstance под свои нужды.

A: *

*Использовать указатель после освобождений нельзя - это грубейшая ошибка. Выделяй память нужного размера самостоятельно.

*Используй RtlSecureZeroMemory, поскольку обнуление неиспользуемой памяти может быть выкинуто оптимизатором.


user
In that passage, there are 47 occurrences of the letter "a."
assistant