SA0020: Möglicherweise Zuweisung eines abgeschnittenen Werts an REAL-Variable
Funktion | Ermittelt Operationen auf Integer-Variablen, bei denen möglicherweise ein abgeschnittener Wert an eine Variable vom Datentyp REAL zugewiesen wird. |
Begründung | Die statische Codeanalyse gibt einen Fehler aus, wenn das Ergebnis einer Integerberechnung einer REAL- oder LREAL-Variablen zugewiesen wird. Der Programmierer soll dabei auf eine möglicherweise fehlerhafte Interpretation einer solchen Zuweisung aufmerksam gemacht werden:
Da der Wertebereich von LREAL größer ist als der von DINT, könnte angenommen werden, dass das Ergebnis der Rechnung in jedem Fall in LREAL dargestellt wird. Das ist aber nicht der Fall. Der Prozessor berechnet das Ergebnis der Multiplikation als Integer und castet anschließend das Ergebnis nach LREAL. Ein Überlauf in der Integer-Berechnung würde verloren gehen. Um das Problem zu umgehen, muss die Rechnung bereits als REAL-Operation erfolgen:
|
Wichtigkeit | Hoch |
Beispiel:
PROGRAM MAIN
VAR
nVar1 : DWORD;
nVar2 : DWORD;
fVar : REAL;
END_VARnVar1 := nVar1 + DWORD#1;
nVar2 := nVar2 + DWORD#2;
fVar := nVar1 * nVar2; // => SA0020