Skip to main content

SA0065: L'aggiunta del puntatore non corrisponde alla dimensione della base

Rileva aggiunte di puntatori per le quali il valore da aggiungere non corrisponde alla dimensione di base del puntatore. Solo i valori letterali della dimensione dei dati di base e i loro multipli possono essere aggiunti senza errori.

Motivazione: In CODESYS (a differenza di C e C++), quando si aggiunge un puntatore con un valore intero, viene aggiunto solo questo valore intero come numero di byte e non il valore intero moltiplicato per la dimensione di base.

Esempio 76. Esempio a ST
pINT := ADR(array_of_int[0]);
pINT := pINT + 2;   //in CODESYS, pINT then points to array_of_int[1]

Questo codice funzionerebbe diversamente in C:

short* pShort
pShort = &(array_of_short[0])
pShort = pShort + 2;  //in C, pShort then points to array_of_short[2]


Pertanto, dentro CODESYS, dovresti sempre aggiungere a un puntatore un multiplo della dimensione di base del puntatore. Altrimenti, il puntatore potrebbe puntare a non allineato memoria che (a seconda del processore) può portare a un'eccezione di allineamento quando si accede ad essa.

Importanza: Alta

Esempio 77. Esempio
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

Uscita in Messaggi vista:

  • sa_icon_message.png SA0065: Aggiunta errata del puntatore alla dimensione di base