kleines Beispiel ... wird komplizierter, wenn der String noch irgendwo "verrechnet" wird (z.B. mit 'nem Pfad zusammengesetzt)
Delphi-Quellcode:
type
// For System.pas internal use only.
// Note, this type is duplicated in getmem.inc for diagnostic purposes. Keep in sync.
PStrRec = ^StrRec;
StrRec = packed record
{$IF defined(CPU64BITS)}
_Padding: Integer; // Make 16 byte align for payload..
{$ENDIF}
codePage: Word;
elemSize: Word;
refCnt: Integer;
length: Integer;
end;
Size := SizeOf(StrRec) + Length('123456' + #0#0) * SizeOf(Char)
12 + (6+2)*2 = 28 // '123456'
12 + (5+2)*2 = 24 // '12345'
Delphi-Quellcode:
type
SmallBlockTypes: array[0..NumSmallBlockTypes - 1] of TSmallBlockType =(
{8/16 byte jumps}
(BlockSize: 16{$ifdef UseCustomFixedSizeMoveRoutines}; UpsizeMoveProcedure: {$ifdef CPU386)}Move12{$else}Move8{$endif}{$endif}),
(BlockSize: 24{$ifdef UseCustomFixedSizeMoveRoutines}; UpsizeMoveProcedure: Move20{$endif}),
(BlockSize: 32{$ifdef UseCustomFixedSizeMoveRoutines}; ...
'1234567' liegt in SmallBlockTypes 32 und davor/dahinter sind 2 Byte Offset frei
'123456' liegt in SmallBlockTypes 32 und davor/dahinter sind 4 Byte Offset frei
'12345' liegt in SmallBlockTypes 28 und davor/dahinter sind 0 Byte Offset frei
Entweder wird mit diesem String irgendwas überschrieben (Overflow) oder irgendwas Anderes überschreibt da was und dein String landet nur zufällig in dem Block, wo das passiert.