Übersicht und Beschreibung (Regeln)
![]() | Strikte IEC-Regeln prüfen Die Prüfungen unterhalb des Knotens "Strikte IEC-Regeln prüfen" ermitteln Funktionalitäten und Datentypen, die in TwinCAT in Erweiterung der IEC61131-3 erlaubt sind. |
![]() | Gleichzeitigen/Konkurrierenden Zugriff prüfen Zu diesem Thema existierenden die folgenden Regeln: SA0006: Schreibzugriff aus mehreren Tasks SA0103: Gleichzeitiger Zugriff auf nicht-atomare Daten
Bitte beachten Sie, dass nur direkte Zugriffe erkannt werden können. Indirekte Zugriffe, beispielsweise per Pointer/Referenz, werden nicht aufgelistet. Bitte beachten Sie außerdem die Dokumentation zum Thema "Multitask-Datenzugriffs-Synchronisation in der SPS", in der einige Hinweise zur Notwendigkeit und den Möglichkeiten einer Datenzugriffs-Synchronisation enthalten sind. |
Parametrierbare Regeln
Bitte beachten Sie, dass einige Regeln parametrierbar sind und beispielsweise Grenzen individuell eingestellt werden können. Die Parameter, die bei der jeweiligen Prüfung berücksichtigt werden sollen, können Sie konfigurieren, indem Sie innerhalb der Regelkonfiguration auf die Zeile der entsprechenden Regel doppelklicken (SPS-Projekteigenschaften > Kategorie "Static Analysis" > Registerkarte "Regeln"). In dem aufgehenden Dialog können Sie die Regelparameter einstellen. Die aktuell konfigurierten Parameter werden in der "Limits"-Spalte der Regelkonfiguration angezeigt.
Die folgenden Regeln sind parametrierbar:
- SA0100: Variablen größer als <n> Bytes
- SA0101: Namen mit unzulässiger Länge
- SA0166: Maximale Anzahl an Eingabe-/Ausgabe-/VAR_IN_OUT-Variablen
- SA0178: Kognitive Komplexität
- SA0179: Kopplung zwischen Objekten
- SA0181: Unzulässige Symbole
Nicht verwendete Objekte auflisten
- SA0031: Nicht verwendete Signaturen
- SA0032: Nicht verwendete Aufzählungskonstante
- SA0033: Nicht verwendete Variablen
- SA0035: Nicht verwendete Eingabevariablen
- SA0036: Nicht verwendete Ausgabevariablen
Konvertierungen
- SA0019: Implizite Pointer-Konvertierungen
- SA0130: Implizite erweiternde Konvertierungen
- SA0133: Explizite einschränkende Konvertierungen
- SA0134: Explizite vorzeichenbehaftete/vorzeichenlose Konvertierungen
Verwendung direkter Adressen
- SA0005: Ungültige Adressen und Datentypen
- SA0047: Zugriff auf direkte Adressen
- SA0048: AT-Deklarationen auf direkte Adressen
Regeln für Operatoren
- SA0051: Vergleichsoperationen auf BOOL-Variablen
- SA0052: Unübliche Schiebeoperation
- SA0053: Zu große bitweise Verschiebung
- SA0054: Vergleich von REAL/LREAL auf Gleichheit/Ungleichheit
- SA0055: Unnötige Vergleichsoperationen von vorzeichenlosen Operanden
- SA0056: Konstante außerhalb des gültigen Bereichs
- SA0057: Möglicher Verlust von Nachkommastellen
- SA0058: Operation auf Enumerationsvariablen
- SA0059: Vergleichsoperationen, die immer TRUE oder FALSE liefern
- SA0060: Null als ungültiger Operand
- SA0061: Unübliche Operation auf Pointer
- SA0062: Ausdruck ist konstant
- SA0063: Möglicherweise nicht 16-bitkompatible Operationen
- SA0064: Addition eines Pointers
- SA0065: Pointer-Addition passt nicht zur Basisgröße
- SA0066: Verwendung von Zwischenergebnissen
Regeln für Anweisungen
FOR-Anweisungen:
- SA0072: Ungültige Verwendung einer Zählervariablen
- SA0073: Verwendung einer nicht-temporären Zählervariablen
- SA0081: Obergrenze ist kein konstanter Wert
CASE-Anweisungen:
- SA0075: Fehlendes ELSE
- SA0076: Fehlende Aufzählungskonstante
- SA0077: Unstimmigkeit des Enumerationstyps mit CASE-Ausdruck
- SA0078: CASE-Anweisungen ohne CASE-Zweig
Strikte IEC-Regeln prüfen
- SA0111: Zeigervariablen
- SA0112: Referenzvariablen
- SA0113: Variablen mit Datentyp WSTRING
- SA0114: Variablen mit Datentyp LTIME
- SA0115: Deklarationen mit Datentyp UNION
- SA0117: Variablen mit Datentyp BIT
- SA0119: Objektorientierte Funktionalität
- SA0120: Programmaufrufe
- SA0121: Fehlende VAR_EXTERNAL-Deklarationen
- SA0122: Als Ausdruck definierter Arrayindex
- SA0123: Verwendung von INI, ADR oder BITADR
- SA0147: Unübliche Schiebeoperation - strikt
- SA0148: Unüblicher Bitzugriff - strikt
Regeln für Initialisierungen
- SA0118: Initialisierungen nicht mit Konstanten
- SA0124: Dereferenzierungszugriff in Initialisierungen
- SA0125: Referenzen in Initialisierungen
Mögliche Verwendung nicht initialisierter Variablen
- SA0039: Mögliche Null-Pointer-Dereferenzierung
- SA0046: Mögliche Verwendung nicht initialisierter Schnittstellen
- SA0145: Mögliche Verwendung nicht initialisierter Referenzen
Metriken
Weitere Regeln
- SA0001: Unerreichbarer Code
- SA0002: Leere Objekte
- SA0003: Leere Anweisungen
- SA0004: Mehrfacher Schreibzugriff auf Ausgang
- SA0006: Schreibzugriff aus mehreren Tasks
- SA0007: Adressoperator auf Konstanten
- SA0008: Unterbereichstypen prüfen
- SA0009: Nicht verwendete Rückgabewerte
- SA0010: Arrays mit nur einer Komponente
- SA0011: Nutzlose Deklarationen mit nur einer einzigen Komponente
- SA0012: Variablen, die als Konstanten deklariert werden könnten
- SA0013: Deklarationen mit gleichem Variablennamen
- SA0014: Zuweisungen auf Instanzen
- SA0015: Zugriff auf globale Daten über FB_init
- SA0016: Lücken in Strukturen
- SA0017: Nicht-reguläre Zuweisungen auf Pointer-Variable
- SA0018: Unübliche Bitzugriffe
- SA0020: Möglicherweise Zuweisung eines abgeschnittenen Werts an REAL-Variable
- SA0021: Weitergabe der Adresse einer temporären Variablen
- SA0022: (Möglicherweise) nicht zugewiesene Rückgabewerte
- SA0023: Komplexe Rückgabewerte
- SA0024: Nicht typisierte Literale
- SA0025: Unqualifizierte Enumerationskonstanten
- SA0026: Möglicherweise Abschneiden von Strings
- SA0027: Mehrfachverwendung des Namens
- SA0028: Überlappende Speicherbereiche
- SA0029: Notation in Implementierung und Deklaration unterschiedlich
- SA0034: Enumerationsvariablen mit falscher Zuweisung
- SA0037: Schreibzugriff auf Eingabevariable
- SA0038: Lesezugriff auf Ausgabevariable
- SA0040: Mögliche Division durch Null
- SA0041: Möglicherweise schleifeninvarianter Code
- SA0042: Verwendung unterschiedlicher Zugriffspfade
- SA0043: Verwendung einer globalen Variablen in nur einer POU
- SA0044: Deklarationen mit Schnittstellenreferenz
- SA0095: Zuweisung in Bedingung
- SA0102: Zugriff von außen auf lokale Variablen
- SA0103: Gleichzeitiger Zugriff auf nicht-atomare Daten
- SA0105: Mehrfache Instanzaufrufe
- SA0106: Virtuelle Methodenaufrufe in FB_init
- SA0107: Fehlen von formalen Parametern
- SA0140: Auskommentierte Anweisungen
- SA0150: Verletzung von Unter- oder Obergrenzen der Metriken
- SA0160: Rekursive Aufrufe
- SA0161: Ungepackte Struktur in gepackter Struktur
- SA0162: Fehlende Kommentare
- SA0163: Verschachtelte Kommentare
- SA0164: Mehrzeilige Kommentare
- SA0167: Temporäre Funktionsbausteininstanzen
- SA0168: Unnötige Zuweisungen
- SA0169: Ignorierte Ausgänge
- SA0170: Adresse einer Ausgabevariablen sollte nicht verwendet werden
- SA0171: Enumerationen sollten das Attribut 'strict' haben
- SA0172: Möglicher Versuch eines Zugriffs außerhalb der Arraygrenzen
- SA0175: Verdächtige Operation auf Zeichenkette
- SA0180: Indexbereich deckt nicht das gesamte Array ab
