Skip to main content

Dialog: Projekteinstellungen: Static Analysis Light

Symbol: _cds_icon_stat_analy_light.png

Funktion: Der Dialog aktiviert die Prüfungen, die bei der Light-Version der Statischen Analyse in CODESYS bei einer Codeerzeugung jeweils durchführt werden.

Aufruf: Befehl Projekt → Projekteinstellungen, Kategorie Static Analysis Light

Tipp

Sie können die statische Codeanalyse für Codeteile ausschließen, indem Sie den Code mit dem Pragma {analysis} oder dem Pragma {attribute 'analysis' := '...'} kennzeichnen.

Für weitere Informationen siehe: Code statisch analysieren

Zusätzliche Kompilierungsprüfungen

SA0033: Nicht verwendete Variablen

Ermittelt Variablen, die deklariert sind, aber innerhalb des kompilierten Programmcodes nicht verwendet werden

Für GVL-Variablen: Wenn es in einem Projekt mehrere Applikationen gibt, werden nur die Objekte unter der gerade aktiven Applikation berücksichtigt. Wenn es nur eine einzige Applikation gibt, werden auch die Objekte in der Ansicht POUs betrachtet.

SA0028: Überlappende Speicherbereiche

Ermittelt die Codestellen, durch die 2 oder mehr Variablen denselben Speicherplatz belegen

Beispielsweise tritt dies auf, wenn es die folgenden Deklarationen gibt: var1 AT %QB21: INT und var2 AT %QD5: DWORD. In diesem Fall verwenden beide Variablen Byte 21, d. h. die Speicherbereiche der Variablen überlappen.

SA0006: Schreibzugriff aus mehreren Tasks

Ermittelt Variablen, auf die von mehr als einer Task geschrieben werden

SA0004: Mehrfacher Schreibzugriff auf Ausgang

Ermittelt Ausgänge, die an mehr als einer Position geschrieben werden

Hinweis: Es wird kein Fehler ausgegeben, wenn auf eine Ausgabevariable (VAR_IN_OUT) in verschiedenen Zweigen von IF oder CASE Anweisungen geschrieben werden.

Hinweis: Diese Regel kann nicht über Pragma abgeschaltet werden!

SA0027: Mehrfachverwendungen von Bezeichnern

Ermittelt Mehrfachverwendung des Namens/Bezeichners einer Variable oder eines Objekts (POU) innerhalb des Gültigkeitsbereichs eines Projekts

. Die folgenden Fälle werden abgedeckt:
  • Der Name einer Enumerationskonstante ist derselbe, wie der in einer anderen Aufzählung innerhalb der Applikation oder einer eingebundenen Bibliothek verwendeten.

  • Der Name einer Variablen ist derselbe wie der eines Objekts innerhalb der Applikation oder einer eingebundenen Bibliothek.

  • Der Name einer Variablen ist derselbe wie der einer Enumerationskonstante in einer Enumeration in der Applikation oder einer eingebundenen Bibliothek.

  • Der Name eines Objekts ist derselbe wie der eines anderen Objekts in der Applikation.

  • Der Name einer Variablen ist derselbe wie der Name einer Methode.

  • Der Name eines Objekts ist derselbe wie der Name eines Objekts, das übergeordnet ist („Parent object“).

SA0167: Temporäre Funktionsbaustein-Instanzen

Die Prüfung ermittelt Funktionsbaustein-Instanzen, die als temporäre Variablen deklariert sind. Dies betrifft Instanzen, die in einer Methode oder in einer Funktion oder als VAR_TEMP deklariert sind, und die deshalb in jedem Abarbeitungszyklus oder bei jedem Bausteinaufruf neu initialisiert werden.

SA0175 : Verdächtige Operation bei einem String

Standardmäßig inaktiv

Identifiziert Codestellen, die bei einer UTF-8-Kodierung verdächtig sind

Folgende Konstrukte werden erfasst:

  • Indexzugriff auf einen Single-Byte-String

    Beispiel: str[2]

    Meldung: Verdächtige Operation auf String: Indexzugriff ' <expression> '

  • Adresszugriff auf einen Single-Byte-String

    Beispiel: ADR(str)

    Meldung: Verdächtige Operation auf String: Möglicher Indexzugriff ' <expression> '

  • Aufruf einer Stringfunktion der Standardbibliothek außer CONCAT und LEN

    Meldung: Verdächtige Operation auf String: Möglicher Indexzugriff ' <expression> '

  • Einzelnes Byte-Literal, das Nicht-ASCII-Zeichen enthält

    Beispiel:

    str := '99€';

    str := 'Ä';

    Meldung: Verdächtige Operation auf String: Literal ' <literal> ' enthält Nicht-ASCII-Zeichen

Abhängig vom Ergebnis der Prüfung ist es ratsam, die Compile-Option UTF-8-Kodierung für Strings nicht zu aktivieren.

Für weitere Informationen siehe: Compile-Optionen

Beispiel 544. Beispiele

SA0003: Leere Anweisungen

;
(* Comment *);
iVar;

SA0006: Gleichzeitiger Zugriff

FUNCTION_BLOCK ADD_FB
g_iTemp1 := g_iTemp1 + INT#1;
PROGRAM PLC_PRG  //controlled by MainTask
g_iTemp1 := g_iTemp1 + INT#2;
g_xTemp2 := g_iTemp1 > INT#10;
PROGRAM PLC_PRG_1  //controlled by SubTask
g_iTemp1 := g_iTemp1 - INT#3;
g_xTemp2 := g_iTemp1 < INT#-10;

SA0004: Mehrfacher Schreibzugriff auf Ausgang

VAR_GLOBAL
    g_xVar AT %QX0.0 : BOOL ;
    g_iTest AT %QW0 : INT ;
END_VAR
PROGRAM PLC_PRG
IF iCondition < INT#0 THEN
    g_xVar := TRUE;
    g_iTest := INT#12;
END_IF
CASE iCondition OF
    INT#1:
        g_xVar := FALSE;
    INT#2:
        g_iTest := INT#11;
    ELSE
        g_xVar := TRUE;
        g_iTest := INT#9;
END_CASE

SA0006: Schreibzugriff aus mehreren Tasks

FUNCTION_BLOCK ADD_FB
g_iTemp1 := g_iTemp1 + INT#1;
PROGRAM PLC_PRG  // Controlled by MainTask
g_iTemp1 := g_iTemp1 + INT#2;
g_xTemp2 := g_iTemp1 > INT#10;
PROGRAM PLC_PRG_1  //Controlled by SubTask
g_iTemp1 := g_iTemp1 - INT#3;
g_xTemp2 := g_iTemp1 < INT#-10;

SA0027: Mehrfachverwendung des Namens

PROGRAM PLC_PRG
VAR
    ton : INT; // error SA0027
END_VAR

SA0029: Notation in Implementierung und Deklaration unterschiedlich

Im Gerätebaum gibt es einen Baustein PLC_PRG und einen Baustein fnc (Funktion).

PROGRAM PLC_PRG
VAR
    iVar:INT;
    _123test_var_: INT;
END_VAR
ivar := iVar + 1; // notation different to that in the declaration part ->   SA0029
_123TEST_var_ := _123test_var_INT; // notation different to that in the declaration part ->   SA0029
Fnc(); // notation different to that in the devices tree ->   SA0029

SA0167: Temporäre Funktionsbaustein-Instanzen

PROGRAM PLC_PRG
VAR
END_VAR
VAR_TEMP
    yafb: AFB;
END_VAR

FUNCTION Fun : INT
VAR_INPUT
END_VAR
VAR
    funafb: AFB;
END_VAR
METHOD METH: INT
VAR_INPUT
END_VAR
VAR
    methafb: AFB;
END_VAR


Für weitere Informationen siehe: Code statisch analysieren