SA0065 : Ajout incorrect du pointeur à la taille de base
Détecte les ajouts de pointeur pour lesquels la valeur à ajouter ne correspond pas à la taille de base du pointeur. Seuls les littéraux de la taille des données de base et leurs multiples peuvent être ajoutés sans erreur.
Justification : Dans CODESYS (contrairement à C et C++), lors de l'ajout d'un pointeur avec une valeur entière, seule cette valeur entière est ajoutée en tant que nombre d'octets, et non la valeur entière multipliée par la taille de base.
pINT := ADR(array_of_int[0]); pINT := pINT + 2; //in CODESYS, pINT then points to array_of_int[1]
Ce code fonctionnerait différemment en C :
short* pShort pShort = &(array_of_short[0]) pShort = pShort + 2; //in C, pShort then points to array_of_short[2]
Par conséquent, dans CODESYS, vous devez toujours ajouter un multiple de la taille de base du pointeur à un pointeur. Sinon, le pointeur peut pointer vers non aligné mémoire qui (selon le processeur) peut conduire à une exception d'alignement lors de l'accès à celle-ci.
Importance : Élevée
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
Sortie dans le messages voir:
SA0065 : Ajout incorrect du pointeur à la taille de base