Skip to main content

SA0065: Pointeraddition passt nicht zur Basisgröße

Ermittelt Pointeradditionen, bei denen der zu addierende Wert nicht zur Basisdatengröße des Pointers passt. Fehlerfrei können nur Literale der Basisdatengröße und Vielfache davon addiert werden.

Begründung: In CODESYS (im Gegensatz zu C und C++) wird bei einer Addition eines Pointers mit einem Integerwert nur dieser Integerwert als Anzahl der Bytes addiert, und nicht der Integerwert mit der Basisgröße multipliziert.

Beispiel 76. Beispiel in ST
pINT := ADR(array_of_int[0]);
pINT := pINT + 2;   //in CODESYS, pINT then points to array_of_int[1]

Dieser Code würde in C anders funktionieren:

short* pShort
pShort = &(array_of_short[0])
pShort = pShort + 2;  //in C, pShort then points to array_of_short[2]


Daher sollte man in CODESYS immer ein Vielfaches der Basisgröße des Pointers zu einem Pointer addieren. Ansonsten zeigt der Pointer möglicherweise auf einen nicht-ausgerichteten (not aligned ) Speicher was (je nach Prozessor) beim Zugriff zu einer Alignment-Exception führen kann.

Wichtigkeit: Hoch

Beispiel 77. Beispiel
VAR
    pudiTest:POINTER TO UDINT;
    udiTest:UDINT;
    prTest:POINTER TO REAL;
    rTest:REAL;
END_VAR
pudiTest := ADR(udiTest) + 4;    // OK
pudiTest := ADR(udiTest) + ( 2 + 2 );    // OK
pudiTest := ADR(udiTest) + SIZEOF(UDINT);    // OK
pudiTest := ADR(udiTest) + 3;    // SA0065
pudiTest := ADR(udiTest) + 2*SIZEOF(UDINT);    // OK
pudiTest := ADR(udiTest) + ( 3 + 2 );    // SA0065
prTest := ADR(rTest);
prTest := prTest + 4;    // OK
prTest := prTest + ( 2 + 2 );    // OK
prTest := prTest + SIZEOF(REAL);    // OK
prTest := prTest + 1;    // SA0065
prTest := prTest + 2;    // SA0065
prTest := prTest + 3;    // SA0065
prTest := prTest + ( SIZEOF(REAL) - 1 );    // SA0065
prTest := prTest + ( 1 + 4 );    // SA0065

Ausgabe unter Ansicht Meldungen:

  • sa_icon_message.png SA0065: Pointeraddition passt nicht zur Basisgröße