SA0130: Conversioni implicite in espansionePermalink

Rileva le conversioni implicite da tipi di dati più piccoli a tipi di dati più grandi.

Giustificazione: Il compilatore consente qualsiasi assegnazione di tipi diversi quando l'intervallo di valori del tipo sorgente è completamente contenuto nell'intervallo di valori del tipo di destinazione. Tuttavia, il compilatore inserisce la conversione nel codice il più tardi possibile. Per un'assegnazione 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. Per evitarlo, si possono già convertire gli elementi: ‎lint := TO_LINT(dint) * TO_LINT(dint)‎. Pertanto, può essere utile segnalare le posizioni in cui il compilatore implementa conversioni implicite, per verificare se sono esattamente quelle previste. Inoltre, le conversioni esplicite possono essere usate per migliorare la portabilità su altri sistemi, quando questi ultimi hanno controlli di tipo più restrittivi.

Importanza: Basso

Esempio

PROGRAM PLC_PRG
VAR
 byTemp : BYTE;
 usiTemp : USINT;
	uiTemp: UINT;
	iTemp : INT; 
	udiTemp: UDINT;
 diTemp : DINT;
 uliTemp : ULINT;
	liTemp : LINT;
	lwTemp : LWORD;
	lrTemp : LREAL;
END_VAR

liTemp := iTemp;	   // SA0130
uliTemp := usiTemp;	// SA0130
lwTemp := udiTemp;	 // SA0130
lrTemp := byTemp;	  // SA0130
diTemp := uiTemp;	  // SA0130

byTemp.5 := FALSE; 	// OK (BIT_BOOL conversion)

--> SA0130: Implicit widening conversion from type 'INT' to type 'LINT'
--> SA0130: Implicit widening conversion from type 'USINT' to type 'ULINT'
--> SA0130: Implicit widening conversion from type 'UDINT' to type 'LWORD'
--> SA0130: Implicit widening conversion from type 'BYTE' to type 'LREAL'
--> SA0130: Implicit widening conversion from type 'UINT' to type 'DINT'