Skip to main content

SA0130: Conversioni espandibili implicite

Rileva le posizioni del codice in cui le conversioni da tipi di dati più piccoli a quelli più grandi vengono eseguite implicitamente durante le operazioni aritmetiche

Giustificazione: Il compilatore consente qualsiasi assegnazione di tipi diversi se l'intervallo di valori del tipo sorgente è completamente contenuto nell'intervallo di valori del tipo di destinazione. Tuttavia, il compilatore creerà una conversione nel codice il più tardi possibile. Per un incarico di tipo lint := dint * dint, il compilatore esegue la conversione implicita solo dopo la moltiplicazione:

lint := TO_LINT(dint * dint);

Un overflow viene quindi troncato. Se vuoi evitarlo, puoi già convertire gli elementi:

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

Pertanto, potrebbe essere utile segnalare le posizioni in cui il compilatore implementa le conversioni implicite per verificare se queste sono esattamente ciò che si intende. Inoltre, è possibile utilizzare conversioni esplicite per migliorare la portabilità su altri sistemi quando tali sistemi dispongono di controlli di tipo più restrittivi.

Importanza: bassa

Esempio 55. Esempio
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;

Uscita in Messages vista:

  • sa_icon_message.png SA0130: Conversione espandibile implicita dal tipo 'DINT' al tipo 'LINT'

  • sa_icon_message.png SA0130: Conversione espandibile implicita dal tipo 'USINT' al tipo 'ULINT'

  • sa_icon_message.png SA0130: Conversione espandibile implicita dal tipo 'UDINT' al tipo 'LWORD'

  • sa_icon_message.png SA0130: Conversione espandibile implicita dal tipo 'USINT' al tipo 'LREAL'

  • sa_icon_message.png SA0130: Conversione espandibile implicita dal tipo 'UINT' al tipo 'DINT'