Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Auf legalen zugriff prüfen vor AV oder SegFault (https://www.delphipraxis.net/202185-auf-legalen-zugriff-pruefen-vor-av-oder-segfault.html)

QuickAndDirty 7. Okt 2019 12:25

Auf legalen zugriff prüfen vor AV oder SegFault
 
Hallo,
wenn man Fehler macht kann es ja vorkommen, dass auch ein Zugriff über eine Objektvariable die "Assigned" ist zu einer Zugriffsverletzung führt.

Da es "jemanden" gibt der diese Exception wirft müsste es doch auch möglich sein darauf zu prüfen bevor die zugriffsverletzung passiert, oder?
Delphi-Quellcode:
If islegal(Myobject.free) then
Begin

end;
Oder?

dummzeuch 7. Okt 2019 12:52

AW: Auf legalen zugriff prüfen vor AV oder SegFault
 
Nein, nicht wirklich. Zugriffe auf bereits freigegebene Objekte können eine Zeit lang weiterhing funktionieren (wenn auch ggf. Unsinn anstellen), solange deren Speicher nicht anderweitig benutzt wurde.

Und selbst wenn nicht, muss ja nicht immer ein ungültiger Self-Pointer sein, der einen Exception auslöst, sondern es kann eine im Objekt verwendete andere Objektreferenz sein, die inzwischen überschrieben wurde oder ein Pointer auf einen String oder auf ein Array.

Je nachdem, wen man fragt, wird FreeAndNil empfohlen oder davon abgeraten. Zumindest sorgt es in den einfachen Fällen (also: Es gibt nur eine Referenz auf das Objekt) dafür, dass es keine Pointer auf freigegebene Objekte übrigbleiben.

peterbelow 7. Okt 2019 13:09

AW: Auf legalen zugriff prüfen vor AV oder SegFault
 
Zitat:

Zitat von QuickAndDirty (Beitrag 1449235)
Hallo,
wenn man Fehler macht kann es ja vorkommen, dass auch ein Zugriff über eine Objektvariable die "Assigned" ist zu einer Zugriffsverletzung führt.

Da es "jemanden" gibt der diese Exception wirft müsste es doch auch möglich sein darauf zu prüfen bevor die zugriffsverletzung passiert, oder?
Delphi-Quellcode:
If islegal(Myobject.free) then
Begin

end;
Oder?

Ganz so einfach ist die Sache nicht, die Exception kommt irgendwo aus den Tiefen der virtuellen Speicherverwaltung des Betriebssystems, und es kommt nicht nur auf die Adresse selbst an, sondern auch darauf, was man damit anstellt (lesen, schreiben, ausführen), und wohin der Pointer zeigt (stack, Delphi memory manager heap, OS memory). Es gibt zwar OS-Funktionen wie IsBadReadPtr, IsBadWritePtr, IsBadCodePtr, VirtualQueryEx, aber die sind nur begrenzt nützlich. Selbst wenn MyObject eine legal aussehende Adresse enthält (z. B. aus einem Block des MMs) muß sie ja nicht auf eine Objekt der erwarteten Klasse zeigen, und selbst wenn sie das tut ist nicht gesagt, dass der Inhalt des Objektes noch in Ordnung ist. Im Allgemeinen ist dies eine Aufgabe aus der Klasse "Fool's errant", es ist pure Zeitverschwendung da schlicht nicht final lösbar. Halt lieber Disziplin, setz konsequent FreeAndNil für Objektvariablen ein, die außerhalb des lokalen Scopes sichtbar sind, oder verwende lifetime management über Interfaces anstelle von Objektreferenzen.

QuickAndDirty 8. Okt 2019 11:05

AW: Auf legalen zugriff prüfen vor AV oder SegFault
 
Ich habe das nicht ganz in der Hand ob der HttpLocalRIO oder so ähnlich für das Soap Framework von Delphi noch existiert oder nicht.
Desegen würde ich gerne auf sowas wie BadPointEr prüfen, auf allen Platformen.



Zurzeit läuft all das über Exceptions...und das ist mehr als nervtötend beim debuggen
Ich habe ein hierarchy von verbindungs Möglichkeiten für den SOAP client
-internet domain
-globale IP
-Localhost

Ob und wie lange HTTPLOCALRIO nach einem fehlgeschlagenen verbindungsversuch existiert habe ich nicht in der Hand.
Also kann ich nicht vorher wissen ob ein Free notwendig ist oder ich damit weiter arbeiten kann.
Also mache ich dann ein free und das kann wenn es nicht notwendig war Zugriffsverletzungen erzeugen...
Und dann erzeuge ich den HTTPLOCALRIO neu.


Gibt es Badpointer auch auf Android und IOS?

Stevie 8. Okt 2019 12:54

AW: Auf legalen zugriff prüfen vor AV oder SegFault
 
Speziell auf SOAP und diese RIO Klassen bezogen, glaub ich eher, du benutzt das falsch. Denn diese Klassen sind eigentlich dafür da, sie über ein von ihnen dynamisch implementieres Interface (Stichwort: TVirtualInterface) anzusprechen. Und dann greift Referenzzählung von Interfaces.

Zu der Problematik allgemein: Ich hab vor längerer Zeit Weak References in Spring eingebaut und mit diesen kann man auch einfach implementieren, dass man automatisch ObjektReferenzen auf nil setzen lässt, wenn das entsprechende Objekt freigegeben wird, so dass sie dann nicht mehr auf ungültigen Speicher zeigen (Stichwort: dangling pointer)

Theoretisch kann man sogar den in der RTL implementieren Mechanismus benutzen, allerdings sind alle notwendigen Routinen dafür (RegisterWeakRef und UnregisterWeakRef in System.pas) nicht von außen zugänglich.

QuickAndDirty 11. Okt 2019 10:11

AW: Auf legalen zugriff prüfen vor AV oder SegFault
 
Ja, richtig benutzt ist der SoapClient wohl nicht dazu geeignet um festzustellen ob ein Dienst auf verscheidnen Gegenstellen erreichbar ist..

Spring funktioniert in Delphi?

Spring im Sinne von Aspektorientierte Entwicklung?

Sherlock 11. Okt 2019 12:52

AW: Auf legalen zugriff prüfen vor AV oder SegFault
 
Spring im Sinne von: https://bitbucket.org/sglienke/spring4d/src/master/

Sherlock


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:08 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