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.
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
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:
SA0065: Pointeraddition passt nicht zur Basisgröße