isPointerPossible() - Wertbereich von Pointern validieren

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

isPointerPossible() - Wertbereich von Pointern validieren

Beitrag von cxAlex »

Ob ein Zeiger gültig ist oder nicht kann man leider nicht feststellen, mit diesem Code immerhin ob er sich in einem gültigen Bereich befindet:

Code: Alles auswählen

Macro Bool(Expression)
  ((Expression) Or #Null)
EndMacro

Procedure isPointerPossible(*Pointer)
  Protected SInfo.System_Info
  GetSystemInfo_(@SInfo)
  ProcedureReturn Bool((*Pointer <= SInfo\lpMaximumApplicationAddress) And (*Pointer >= SInfo\lpMinimumApplicationAddress))
EndProcedure
Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

Ich habe mir angewöhnt Pointer, nachdem sie nichtmehr genutzt werden (zB weil der Speicher freigegeben wurde) direkt auf Null zu setzen.
Und da man jeden Pointer vor Gebrauch wenigstens darauf prüfen sollte, ob er überhaupt irgendwo hin zeigt, kann man so schon viele Fehler finden/verhindern.

Wenn man prüfen muss, ob ein Pointer brauchbar sein könnte, hat man meiner Meinung nach wahrscheinlich irgendwo etwas unsauber gearbeitet.
Entweder man prüft, ob die Zuweisung geklappt hat, oder nicht. Zwischendinger würde ich nicht machen.
pb 4.51
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

> Ich habe mir angewöhnt Pointer, nachdem sie nichtmehr genutzt werden (zB weil der Speicher freigegeben wurde) direkt auf Null zu setzen.

Mach ich auch so. In eigenen Programmen verwende ich sowas auch nicht, nur bei DLLs von 3. prüf ich schon mal ob ich nen gültigen Pointer kriege oder ob die DLL Mist baut.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: isPointerPossible() - Wertbereich von Pointern validiere

Beitrag von DarkDragon »

Ich wollte nur mal auf das hier hinweisen:

IsBadCodePtr
IsBadReadPtr
IsBadStringPtr
IsBadWritePtr

Sind bereits Funktionen die dazu gedacht sind zu prüfen ob der Pointer gültig zu sein scheint.

[EDIT]
Euh dumme Links.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Da steht aber auch das man sie nicht nutzen soll.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

edel hat geschrieben:Da steht aber auch das man sie nicht nutzen soll.
Klar ;-) . Da hab ich auch nichts anderes behauptet.

Was man vielleicht mal versuchen könnte wär ein aktives Garbage-Collector System für PureBasic. Als Precompiler wie bei den OOP dingern oder wie bei remi_meiers Profiler.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Antworten