SA0065: Pointer-Addition passt nicht zur Basisgröße
Funktion | Ermittelt Pointeradditionen, bei denen der zu addierende Wert nicht zur Basis-Datengröße des Pointers passt. Fehlerfrei können nur Literale der Basisdatengröße und Vielfache davon addiert werden. |
Begründung | In TwinCAT (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.
Dieser Code würde in C anders funktionieren:
Daher sollte in TwinCAT immer ein Vielfaches der Basisgröße des Pointers zu einem Pointer addiert werden. 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 |
Beispiele:
PROGRAM MAIN
VAR
pUDINT : POINTER TO UDINT;
nVar : UDINT;
pREAL : POINTER TO REAL;
fVar : REAL;
END_VARpUDINT := ADR(nVar) + 4;
pUDINT := ADR(nVar) + (2 + 2);
pUDINT := ADR(nVar) + SIZEOF(UDINT);
pUDINT := ADR(nVar) + 3; // => SA0065
pUDINT := ADR(nVar) + 2*SIZEOF(UDINT); // => SA0065
pUDINT := ADR(nVar) + (3 + 2); // => SA0065
pREAL := ADR(fVar);
pREAL := pREAL + 4;
pREAL := pREAL + (2 + 2);
pREAL := pREAL + SIZEOF(REAL);
pREAL := pREAL + 1; // => SA0065
pREAL := pREAL + 2; // => SA0065
pREAL := pREAL + 3; // => SA0065
pREAL := pREAL + (SIZEOF(REAL) - 1); // => SA0065
pREAL := pREAL + (1 + 4); // => SA0065