SA0065: Adición de puntero incorrecta al tamaño base
Detecta adiciones de puntero para las cuales el valor que se agregará no coincide con el tamaño base del puntero. Sólo se pueden agregar sin error literales del tamaño de datos base y múltiplos del mismo.
Justificación: En CODESYS (a diferencia de C y C++), al agregar un puntero con un valor entero, solo este valor entero se agrega como número de bytes, y no el valor entero multiplicado por el tamaño base.
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 manera 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 debes agregar un múltiplo del tamaño base del puntero a un puntero. De lo contrario, el puntero puede señalar no alineado memoria que (dependiendo del procesador) puede provocar una excepción de alineación al acceder a ella.
Importancia: Alta
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
Salida en el Mensajes vista:
SA0065: Adición de puntero incorrecta al tamaño base