SA0065: Aggiunta errata del puntatore alla dimensione di basePermalink

Rileva le aggiunte di puntatori per i quali il valore da aggiungere non corrisponde alla dimensione di base del puntatore. È possibile aggiungere solo letterali della dimensione di base. Anche i prodotti della moltiplicazione della dimensione di base non possono essere sommati.

Giustificazione: In CODESYS (a differenza di C e C++), quando si aggiunge un puntatore con un valore intero, solo questo valore intero viene aggiunto come numero di byte, e non il valore intero moltiplicato per la dimensione di base. Esempio in 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, in CODESYS, si dovrebbe sempre aggiungere un multiplo della dimensione di base del puntatore a un puntatore. In caso contrario, il puntatore potrebbe puntare a una memoria non allineata che, a seconda del processore, potrebbe causare un'eccezione di allineamento durante l'accesso.

Importanza: Alto

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);	// 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