Skip to main content

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.

Exemple 76. Exemple en ST
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

Exemple 77. Exemple
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:

  • sa_icon_message.png SA0065 : Ajout incorrect du pointeur à la taille de base