Skip to main content

SA0130: Implizite erweiternde Konvertierungen

Ermittelt Codestellen, an denen bei arithmetischen Operationen implizit Konvertierungen von kleineren in größere Datentypen durchgeführt werden

Begründung: Der Compiler erlaubt jegliche Zuweisungen von unterschiedlichen Typen, wenn der Wertebereich des Quelltyps vollständig im Wertebereich des Zieltyps enthalten ist. Allerdings baut der Compiler eine Konvertierung so spät wie möglich in den Code ein. Bei einer Zuweisung der folgenden Art: lint := dint * dint führt der Compiler die implizite Konvertierung erst nach der Multiplikation durch:

lint := TO_LINT(dint * dint);

Ein Überlauf wird daher abgeschnitten. Wenn Sie das verhindern wollen, können Sie die Konvertierung bereits für die Elemente durchführen lassen:

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

Es kann daher sinnvoll sein, sich Stellen melden zu lassen, an denen der Compiler implizite Konvertierungen einbaut, um zu prüfen, ob diese genau so gewollt sind. Außerdem können explizite Konvertierungen zu besserer Portierbarkeit auf andere Systeme dienen, wenn diese restriktivere Typprüfungen haben.

Wichtigkeit: Niedrig

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

Ausgabe unter Ansicht Meldungen:

  • sa_icon_message.png SA0130: Implizite erweiternde Konvertierung vom Typ 'DINT' zu Typ 'LINT'

  • sa_icon_message.png SA0130: Implizite erweiternde Konvertierung vom Typ 'USINT' zu Typ 'ULINT'

  • sa_icon_message.png SA0130: Implizite erweiternde Konvertierung vom Typ 'UDINT' zu Typ 'LWORD'

  • sa_icon_message.png SA0130: Implizite erweiternde Konvertierung vom Typ 'USINT' zu Typ 'LREAL'

  • sa_icon_message.png SA0130: Implizite erweiternde Konvertierung vom Typ 'UINT' zu Typ 'DINT'