вторник, 9 апреля 2013 г.

Сегодня мне показалось, что я нашёл ошибку в менеджере памяти Delphi XE

Все симптомы говорили об этом.

Я даже выделил тест:


procedure TReallocMemTest.DoIt;
var
 l_Index : Integer;
 l_P : PAnsiChar;
 l_I : Integer;
 l_Size : Integer;
 l_OldSize : Integer;
begin
 for l_Index := 0 to 5000 do
 begin
  l_Size := 10;
  GetMem(l_P, l_Size);
  try
   while (l_Size <= 6144 * 2) do
   begin
    FillChar(l_P^, l_Size, Random($ff));
    l_OldSize := l_Size;
    l_I := PInteger(l_P + l_OldSize - SizeOf(Integer))^;
    Inc(l_Size, Random(20));
    ReallocMem(l_P, l_Size);
    Check(PInteger(l_P + l_OldSize - SizeOf(Integer))^ = l_I);
   end;//l_Size <= 6144
  finally
   FreeMem(l_P);
  end;//try..finally
 end;//for l_Index
end;//TReallocMemTest.DoIt
 
procedure TReallocMemTest.DoIt1;
const
 cMagicSize0 = 10;
 cMagicSize = 3120;
 cNewMagicSize = 6144;
var
 l_P : PAnsiChar;
 l_I : Integer;
begin
 GetMem(l_P, cMagicSize0);
 try
  FillChar(l_P^, cMagicSize0, 10);
  l_I := PInteger(l_P + cMagicSize0 - SizeOf(Integer))^;
  ReallocMem(l_P, cNewMagicSize);
  Check(PInteger(l_P + cMagicSize0 - SizeOf(Integer))^ = l_I);
 
  FillChar(l_P^, cMagicSize, 10);
  l_I := PInteger(l_P + cMagicSize - SizeOf(Integer))^;
  ReallocMem(l_P, cNewMagicSize);
  Check(PInteger(l_P + cMagicSize - SizeOf(Integer))^ = l_I);
 finally
  FreeMem(l_P);
 end;//try..finall
end;//TReallocMemTest.DoIt


И даже поделился с коллегами о своём "открытии". И даже написал в Embarcadero.

Но! Без предварительного вызова МОЕГО КОДА - этот тест - не падает.

Мячик на моей стороне.

Каким же я выглядел идиотом.

Но правда совсем не ошибается лишь тот, кто ничего не делает. Зато я добавил ещё один тест в базу тестов.

Как я уже писал - написанный и ОТЛАЖЕННЫЙ тест - надо не выкидывать, а включать в базу тестов. ЛЮБОЙ. За него "кровью и нервами уплочено".

Как говорится в сказках про Иванушку-дурачка - "не убивай меня - я тебе пригожусь".

Надеюсь, что итоги сегодняшнего дня помогут мне стать капельку мудрее.

P.S. а проблемы на самом деле были вот в этом "хоккее" - http://18delphi.blogspot.com/2013/04/getmem.html

Комментариев нет:

Отправить комментарий