Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Falscher Typecast wie finden (https://www.delphipraxis.net/60513-falscher-typecast-wie-finden.html)

Gruber_Hans_12345 8. Jan 2006 11:00


Falscher Typecast wie finden
 
Hallo, habe da ne Frage

Ich habe vor kurzem mal einige Zeit nen Fehler gesucht und den dann in folgendem Code gefunden

Delphi-Quellcode:
type
  TDataObject = class
  end;

  TDataObject1 = class(TDataObject)
  private
    fDatum : integer;
    fBetrag : Extended;
  end;

....

function TDataList.Sort;
var
  Item : TDataObject;
begin
  if Item is TDataObject1 then begin
    TDataObject1(Item).fBetrag := 12;
  end
  TDataObject1(Item).fDatum := now; // <<< Fehler
end;
Da ich den Type des Objektes nicht überprüft habe, habe ich auch bei einem TDataObject auf ein Feld zugegriffen, das nicht existiert, und dadurch dann an einer anderen Stelle eine AV (oder manchmal auch einen anderen Fehler) verursacht.

Meine Frage ist nun, gibt es ein Toll oder Einstellung, mit dem solche Fehler gefunden werden. Da die Fehler immer an einer anderen Stelle auftreten ist der Fehler extrem schwer zu finden. Und den ganzen Sourcecode zu durchforsten, ob sich noch wo solch ein Fehler versteckt .....

jfheins 8. Jan 2006 11:03

Re: Falscher Typecast wie finden
 
Ich weis, jetzt hilft es dir nichts mehr, aber beim nächsten mal einfach
Delphi-Quellcode:
(Item as TDataObject1).fDatum := now;
nehmen, das gibt dann einen Fehler wenn der Typnicht stimmt ...

(Du könntest jetzt alle " TDataObject1(" suchen und durch as-Typecasts ersetzen, aber ob das so toll ist :gruebel: )

xaromz 8. Jan 2006 11:09

Re: Falscher Typecast wie finden
 
Hallo,
Zitat:

Zitat von Gruber_Hans_12345
Meine Frage ist nun, gibt es ein Toll oder Einstellung, mit dem solche Fehler gefunden werden. Da die Fehler immer an einer anderen Stelle auftreten ist der Fehler extrem schwer zu finden. Und den ganzen Sourcecode zu durchforsten, ob sich noch wo solch ein Fehler versteckt .....

Das Tool heisst Brain 1.0 :wink: , was anderes kann es nicht geben, da kein Programm dieser Welt feststellen kann, ob sich hinter einer Variable wirklich ein Objekt des entsprechenden Typs befindet (da eine Objektvariable eigentlich ein Pointer ist, kann man da ja alles Möglich reinpacken). Der Typ steht ja erst zur Laufzeit fest. Du wirst also Deinen Quelltext Zeile für Zeile selbst begutachten müssen.
Der Hinweis mit as ist nicht schlecht, benötigt aber natürlich etwas Zeit für die Typprüfung. Das sollte aber heutzutage egal sein. (Ich verwende eigentlich nie as, sondern nur eine Abfrage mittels is mit anschliessendem TypeCast, falls in der Prozedur überhaupt verschiedene Objekte vorkommen können, genauso wir Du da machst.)

Gruß
xaromz

Gruber_Hans_12345 8. Jan 2006 11:23

Re: Falscher Typecast wie finden
 
Zitat:

Zitat von xaromz
Hallo,
Das Tool heisst Brain 1.0 :wink: , was anderes kann es nicht geben, da kein Programm dieser Welt feststellen kann, ob sich hinter einer Variable wirklich ein Objekt des entsprechenden Typs befindet (da eine Objektvariable eigentlich ein Pointer ist, kann man da ja alles Möglich reinpacken). Der Typ steht ja erst zur Laufzeit fest. Du wirst also Deinen Quelltext Zeile für Zeile selbst begutachten müssen.
Der Hinweis mit as ist nicht schlecht, benötigt aber natürlich etwas Zeit für die Typprüfung. Das sollte aber heutzutage egal sein. (Ich verwende eigentlich nie as, sondern nur eine Abfrage mittels is mit anschliessendem TypeCast, falls in der Prozedur überhaupt verschiedene Objekte vorkommen können, genauso wir Du da machst.)

Gruß
xaromz

Hätte ich früher bei Memoryleaks, doppelten Freigeben von Objekten und zugriff auf bereits freigegebene Objekte auch gesagt, das es keine Tools geben kann dafür .... und doch es gibt Tools dafür.

Nach Brain 1.0 brauche ich jetzt nicht zu suchen oder :gruebel:

Das mit dem as, statt dem is wäre ne option, aber nachträglich überall einbauen .... wird sehr zeitaufwendig für Zukunftige Sources, wo ich mehere abgeleitete Klassen habe, sicher interessant.
Und suchen nach dem TDataObject wird unmöglich, ich habe sicher 1000 verschiedene Klassentypen in dem Programm drinnen,


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz