Skip to main content

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.

ejemplo 76. 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 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

ejemplo 77. 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);    // 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:

  • sa_icon_message.png SA0065: Adición de puntero incorrecta al tamaño base