Pointer Checks (POU CheckPointer)

Überwachungsfunktion CheckPointer für Zeiger

Verwenden Sie die Funktion, um den Speicherzugriff von Zeigern während der Laufzeit zu überwachen. Im Unterschied zu anderen Überwachungsfunktionen existiert für die Implementierung von CheckPointer kein standardmäßiger Vorschlag. Eine Implementierung muss der Benutzer selbst vornehmen!

Die Funktion CheckPointer soll überprüfen, ob der übergebene Zeiger auf eine gültige Speicheradresse verweist und ob die Ausrichtung des referenzierten Speicherbereichs zum Typ der Variablen passt, auf die der Zeiger verweist. Sind beide Bedingungen erfüllt, so wird der Zeiger selbst zurückgegeben. Andernfalls sollte die Funktion eine angemessene Fehlerbehandlung durchführen.

Pointer Checks (POU CheckPointer) 1:

Deklarationsteil nicht verändern

Um die Funktionalität der Überwachungsfunktionen zu erhalten, dürfen Sie den Deklarationsteil nicht verändern. Als einzige Ausnahme dürfen Sie lokale Variablen hinzufügen.

Pointer Checks (POU CheckPointer) 2:

Für den THIS-Zeiger und den SUPER-Zeiger findet kein impliziter Aufruf der Überwachungsfunktion statt.

Pointer Checks (POU CheckPointer) 3:

Die Funktion CheckPointer wirkt auch auf Variablen vom Typ REFERENCE in gleicher Weise wie auf Zeigervariablen.

Vorlage

Deklaration:

// Implicitly generated code : DO NOT EDIT
FUNCTION CheckPointer : POINTER TO BYTE 
VAR_INPUT
    ptToTest : POINTER TO BYTE;
    iSize    : DINT;
    iGran    : DINT;
    bWrite   : BOOL;
END_VAR

Implementierung (unvollständig!):

// No standard way of implementation. Fill your own code here
{noflow}
CheckPointer := ptToTest;
{flow}

Beim Aufruf übergibt TwinCAT der Funktion folgende Eingabeparameter:

Bei positivem Ergebnis der Überprüfung wird der unveränderte Eingabezeiger zurückgegeben (ptToTest).

Beispiel:

Folgendes Implementierungsbeispiel erzeugt eine Meldung im TwinCAT Ausgabefenster, sobald ein ungültiger Zeiger erkannt werden konnte. Diese Implementierung erkennt verschiedene Arten von ungültigen Zeigern. Es können aber nicht alle ungültigen Zeiger erkannt werden.

// Implicitly generated code : DO NOT EDIT
FUNCTION CheckPointer : POINTER TO BYTE 
VAR_INPUT
    ptToTest : POINTER TO BYTE;
    iSize    : DINT;
    iGran    : DINT;
    bWrite   : BOOL;
END_VAR
IF ptToTest=0 THEN
    ADSLOGSTR(ADSLOG_MSGTYPE_ERROR OR ADSLOG_MSGTYPE_STRING,'CheckPointer failed due to invalid destination address.','');
ELSIF iSize<=0 THEN
    ADSLOGSTR(ADSLOG_MSGTYPE_ERROR OR ADSLOG_MSGTYPE_STRING,'CheckPointer failed due to invalid size.','');
ELSIF iGran<=0 THEN
    ADSLOGSTR(ADSLOG_MSGTYPE_ERROR OR ADSLOG_MSGTYPE_STRING,'CheckPointer failed due to invalid granularity.','');
// -> Please note that the following memory area check is time consuming:
//ELSIF F_CheckMemoryArea(pData:=ptToTest,nSize:=DINT_TO_UDINT(iSize)) = E_TcMemoryArea.Unknown THEN
//    ADSLOGSTR(ADSLOG_MSGTYPE_ERROR OR ADSLOG_MSGTYPE_STRING,'CheckPointer failed due to unknown memory area.','');
END_IF
CheckPointer := ptToTest;

VORSICHT

Folge eines ungültigen Zeigers

Die Folge eines ungültigen Zeigers ist meist ein Stopp der Laufzeit, sobald ein beliebiger Zugriff über diesen Zeiger erfolgt. Die Funktion CheckPointer kann dies meist nicht verhindern. Zweck dieser Überwachungsfunktion ist vielmehr, eine effiziente Ursachendiagnose zu ermöglichen.