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.
Ein Therapeut entspricht 1024 Gigapeut.