Einzelnen Beitrag anzeigen

Incocnito

Registriert seit: 28. Nov 2016
210 Beiträge
 
#1

Automatische Problem-Erkennung

  Alt 26. Okt 2023, 08:52
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
  Mit Zitat antworten Zitat