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
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:
SA0130: Conversione espandibile implicita dal tipo 'DINT' al tipo 'LINT'
SA0130: Conversione espandibile implicita dal tipo 'USINT' al tipo 'ULINT'
SA0130: Conversione espandibile implicita dal tipo 'UDINT' al tipo 'LWORD'
SA0130: Conversione espandibile implicita dal tipo 'USINT' al tipo 'LREAL'
SA0130: Conversione espandibile implicita dal tipo 'UINT' al tipo 'DINT'