Moin zusammen.
Wir hatten heute einen Fehler gefunden, der nicht sofort ersichtlich ist.
Delphi-Quellcode:
...
type TWhatever = class(TForm)
public
Procedure DoSomething(const sVal : String);
Procedure DoMore();
private
FMyVal : String;
end;
...
procedure TWhatever.DoMore();
begin
DoSomeThing(FMyVal);
end;
procedure TWhatever.DoSomething(const sVal : String);
begin
FMyVal := '';
if (sVal = 'bla') then Close();
end;
...
Hier wird in DoMore die Variable FMyVal übergeben und da sVal in DoSomething als const deklariert ist,
erstellt Delphi hier keine Kopie, sondern arbeitet auf dem Original.
Jetzt nehme ich aber in der ersten Zeile ihm das Original unter dem Arsch weg.
Das führt zu Speicherfehlern und dann random irgendwo zu Zugriffsverletzungen.
Lösung hier: "const" weg nehmen, so dass Delphi für sVal eine Kopie anlegt.
Frage: Gibt es eine (automatisierbare) Möglichkeit solche Konstellationen zu erkennen?
Ich würde gerne ausschließen, dass wir solche Fehler irgendwo vertseckt haben und
ich weiß nicht, wie ich sowas suchen kann. Selbst wenn das Problem nicht mehr erkannt werden
kann, wenn Funktionen andere Funktionen aufrufen, die dann den Ursprungswert modifizieren.
Dieser Fehler beunruhigt mich nun doch schon etwas. Und da jetzt "überall" etwas zu bauen, dass
beim Funktionsaufruf den Speicher schützt und entsprechende Exceptions wirft, wenn dieser doch
bearbeitet wird, würde zudem ewig dauern und Ressourcen und Performance fressen.
Vielleicht hat da ja jemand eine Idee zu.
Liebe Grüße
Incocnito