Skip to main content

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

ejemplo 55. Ejemplo
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:

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

  • sa_icon_message.png SA0130: Conversión de expansión implícita del tipo 'USINT' al tipo 'ULINT'

  • sa_icon_message.png SA0130:  Conversión de expansión implícita del tipo 'UDINT' al tipo 'LWORD'

  • sa_icon_message.png SA0130: Conversión de expansión implícita del tipo 'USINT' al tipo 'LREAL'

  • sa_icon_message.png SA0130: Conversión de expansión implícita del tipo 'UINT' al tipo 'DINT'