Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#428

AW: Was nervt euch so, wärend der Programmierung oder so allgemein

  Alt 4. Okt 2011, 13:17
Nerven tun manchmal die sinnlosesten Fehlerchen, welche aber ungehnte Nebenwirkunen zeigen.


Einen dieser Fehler hab ich mal auf folgenden Code reduziert.
Delphi-Quellcode:
procedure MacheMist;
var
  S: string;
  L: Cardinal;
begin
  L := MAX_PATH;
  GetUserName(PChar(S), L);
end;

initialization
  MacheMist;

finalization

end.
(einfach nur ein kleines SetLength(S, i); vergessen)



OK, S ist als Leerstring NIL, also sollte GetUserName mit einer Zugriffsverletzung enden,
tut es aber nicht

Denn PChar leitet dieses NIL auf einen existierenden "Leerstring" um, welcher auf #0 endet.

Tja, nun ist gerade dieser Speicherplatz leider nicht schreibgeschützt (PAGE_READONLY), so wie man es von einer Konstante eventuell erwarten könnte.
Daher überschreibt jetzt GetUserName diesen Speicher und schwups, hat man sich den programmglobalen Leerstring zerschossen.

Alles was also diesen PChar-Leerstring nutzt, wird sich nun verändern.




Tipp: Nehmt eine Form, darauf 2-3 Edits, den Text jeweils rauslöschen und kompilieren+starten.
Am Besten noch mit dieser Funktion:
Delphi-Quellcode:
procedure MacheMist;
const H = 'himi war hier'#0;
var S: string;
begin
  Move(PChar(H)^, PChar(S)^, Length(H) * SizeOf(Char));
end;
Zumindestens ab Delphi 2010 (ab wann genau weiß ich nicht) und mit mindestens WinXP sieht man nun in allen Edits (ohne Fokus) seinen Nutzernamen/meinen Namen.
Genauso war das hier in DBGrids, wo dann alle leeren Zellen plötzlich gefüllt waren.


[edit]
Das Beispiel geht ab da, wo TEdit die Eigenschaft TextHint besitzt.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 4. Okt 2011 um 13:45 Uhr)