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:

fLEAL := nDINT1 * nDINT2.

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:

fLREAL := TO_LREAL(nDINT1) * TO_LREAL(nDINT2)

Wichtigkeit

Hoch

Beispiel:

PROGRAM MAIN 
VAR
    nVar1  : DWORD;
    nVar2  : DWORD;
    fVar   : REAL;
END_VAR
nVar1 := nVar1 + DWORD#1;
nVar2 := nVar2 + DWORD#2;
fVar  := nVar1 * nVar2;          // => SA0020