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
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:
SA0130: Implizite erweiternde Konvertierung vom Typ 'DINT' zu Typ 'LINT'
SA0130: Implizite erweiternde Konvertierung vom Typ 'USINT' zu Typ 'ULINT'
SA0130: Implizite erweiternde Konvertierung vom Typ 'UDINT' zu Typ 'LWORD'
SA0130: Implizite erweiternde Konvertierung vom Typ 'USINT' zu Typ 'LREAL'
SA0130: Implizite erweiternde Konvertierung vom Typ 'UINT' zu Typ 'DINT'