Skip to main content

SA0130 : Conversions à expansion implicite

Détecte les emplacements de code où les conversions de types de données plus petits vers des types de données plus grands sont implicitement effectuées lors d'opérations arithmétiques

Justification : Le compilateur autorise toute affectation de types différents lorsque la plage de valeurs du type source est entièrement contenue dans la plage de valeurs du type cible. Cependant, le compilateur effectuera une conversion dans le code le plus tard possible. Pour une mission de type lint := dint * dint, le compilateur effectue la conversion implicite uniquement après multiplication :

lint := TO_LINT(dint * dint);

Un débordement est donc tronqué. Si vous souhaitez éviter cela, vous pouvez déjà convertir les éléments :

lint := TO_LINT(dint) * TO_LINT(dint);

Par conséquent, il peut être utile de signaler les emplacements où le compilateur implémente des conversions implicites afin de vérifier si celles-ci correspondent exactement à ce qui est prévu. De plus, des conversions explicites peuvent être utilisées pour améliorer la portabilité vers d'autres systèmes lorsque ces systèmes ont des vérifications de type plus restrictives.

Importance : Faible

Exemple 55. Exemple
PROGRAM PLC_PRG
VAR
    d : DINT;
    l : LINT;
    ui : UINT;
    uli : ULINT;
    usi : USINT;
    lw : LWORD;
    udi : UDINT;
    lr : LREAL;
    b : BYTE;
END_VAR
(*The following lines could result in unwanted truncating by implicit conversions 
and should be reported with SA0130*) 
l := d * d;
uli := usi * usi;
lw := udi * udi;
lr := b * b;
d := ui * ui;

Sortie dans le messages voir:

  • sa_icon_message.png SA0130 : Conversión á expansión implícita de tipo 'DINT' a tipo 'LINT'

  • sa_icon_message.png SA0130 : Conversión á expansión implícita de tipo 'DINT' a tipo 'LINT'

  • sa_icon_message.png SA0130 : Conversión á expansión implícita de tipo 'DINT' a tipo 'LINT'

  • sa_icon_message.png SA0130 : Conversión á expansión implícita de tipo 'DINT' a tipo 'LINT'

  • sa_icon_message.png SA0130 : Conversión á expansión implícita de tipo 'DINT' a tipo 'LINT'