Detecta adiciones de punteros cuyo valor a añadir no coincide con el tamaño base del puntero. Sólo se pueden añadir literales del tamaño base. Tampoco se pueden sumar productos de multiplicación del tamaño de la base.
Justificación: En CODESYS (a diferencia de C y C++), cuando se añade un puntero con un valor entero, sólo se añade este valor entero como número de bytes, y no el valor entero multiplicado por el tamaño base. Ejemplo en ST:
pINT := ADR(array_of_int[0]) pINT := pINT + 2 ; // In CODESYS, pINT then points to array_of_int[1]
Este código funcionaría de forma diferente en C:
short* pShort pShort = &(array_of_short[0]) pShort = pShort + 2; // In C, pShort then points to array_of_short[2]
Por lo tanto, en CODESYS, siempre debe añadir un múltiplo del tamaño base del puntero a un puntero. De lo contrario, el puntero puede apuntar a memoria no alineada, lo que (dependiendo del procesador) puede provocar una excepción de alineación al acceder a ella.
Importancia: Alta
Ejemplo
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); // SA0065 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 --> SA0065: Incorrect pointer addition to base size