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
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:
SA0130 : Conversión á expansión implícita de tipo 'DINT' a tipo 'LINT'
SA0130 : Conversión á expansión implícita de tipo 'DINT' a tipo 'LINT'
SA0130 : Conversión á expansión implícita de tipo 'DINT' a tipo 'LINT'
SA0130 : Conversión á expansión implícita de tipo 'DINT' a tipo 'LINT'
SA0130 : Conversión á expansión implícita de tipo 'DINT' a tipo 'LINT'