SA0130: Conversiones en expansión implícitas
Detecta ubicaciones de código donde se realizan implícitamente conversiones de tipos de datos más pequeños a más grandes durante operaciones aritméticas.
Justificación: El compilador permite asignaciones de diferentes tipos cuando el rango de valores del tipo de origen está completamente contenido dentro del rango de valores del tipo de destino. Sin embargo, el compilador realizará una conversión en el código lo más tarde posible. Para una asignación de tipo lint := dint * dint
, el compilador realiza la conversión implícita sólo después de la multiplicación:
lint := TO_LINT(dint * dint);
Por tanto, se trunca un desbordamiento. Si desea evitar esto, ya puede convertir los elementos:
lint := TO_LINT(dint) * TO_LINT(dint);
Por lo tanto, puede resultar útil informar las ubicaciones donde el compilador implementa conversiones implícitas para comprobar si son exactamente lo que se pretende. Además, se pueden utilizar conversiones explícitas para mejorar la portabilidad a otros sistemas cuando esos sistemas tienen comprobaciones de tipo más restrictivas.
Importancia: Baja
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;
Salida en el Messages vista:
SA0130: Conversión de expansión implícita de tipo 'DINT' al tipo 'LINT'
SA0130: Conversión de expansión implícita del tipo 'USINT' al tipo 'ULINT'
SA0130: Conversión de expansión implícita del tipo 'UDINT' al tipo 'LWORD'
SA0130: Conversión de expansión implícita del tipo 'USINT' al tipo 'LREAL'
SA0130: Conversión de expansión implícita del tipo 'UINT' al tipo 'DINT'