Original in Russian: http://18delphi.blogspot.ru/2013/04/delphi-xe.html
All symptoms indicated it.
I even specified a test:
I even told my colleagues about my “discovery”. I even wrote to Embarcadero.
But! This test does not fall if you do not call MY CODE first.
The ball is on my side.
I looked so stupid.
But only he that never climbed never fell. Instead, I added one more test to the base.
I’ll repeat that the written and DEBUGGED test should not be thrown but added to the test base. It took our “nerves and blood”.
It reminds me of a Russian fairy-tale: “Don’t dead me, Ivanushka the Fool, you can make use of me”.
I hope, that I’ve become a bit wiser today.
P.S. The actual problems were in this “staff” - http://18delphi.blogspot.com/2015/02/how-to-find-out-true-size-of-memory.html
All symptoms indicated it.
I even specified a test:
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
I even told my colleagues about my “discovery”. I even wrote to Embarcadero.
But! This test does not fall if you do not call MY CODE first.
The ball is on my side.
I looked so stupid.
But only he that never climbed never fell. Instead, I added one more test to the base.
I’ll repeat that the written and DEBUGGED test should not be thrown but added to the test base. It took our “nerves and blood”.
It reminds me of a Russian fairy-tale: “Don’t dead me, Ivanushka the Fool, you can make use of me”.
I hope, that I’ve become a bit wiser today.
P.S. The actual problems were in this “staff” - http://18delphi.blogspot.com/2015/02/how-to-find-out-true-size-of-memory.html
Комментариев нет:
Отправить комментарий