Modul Never used Used before Set Never Set Set but never Used
FileDir 6 (loc. Vars)
Files 3
Modules
Fonts 2 (array)
Texts 7
TextFrames 4 5
Viewers 1
MenuViewers 1 (import)
Oberon 4 4 (Loop) 7 (MV.New)
Programm Analyse - oder, weshalb steht da bloss diese ?@!#$ Variable ?
Um was geht's?
- Nie gebraucht:
nderungen und Revisionen eines Moduls => Variablen, Konstanten, Typen, Felder in Typen, Prozeduren und Module, welche deklariert wurden und nicht mehr gebraucht werden.
Kein Fehler, aber Programm schwerer verst
ndlich.
- Gebrauch vor Initialisierung: Variablen werden vor ihrer Initialisierung gebraucht. Variablen werden nie initialisiert.
Echter Fehler, sofern im selben Scope (intermediate Variables!).
- Initialisierung ohne Gebrauch: typisches Beispiel, welches keinen Fehler darstellt:
V := MenuViewers.New(...)
- Nicht_exportierte (typ_gebundene) Prozeduren, welche nie aufgerufen werden (dead code).
- Importierte Module, welche nie referenziert werden. Probleme mit Lader m
glich (v.a. wenn es distributiert wird). Langsamere Compilation.
Implementation:
Diplomarbeit bei Karl Rege. Source war schwer lesbar und war nicht f
r Oberon_2.
=> Parser Modul (OPP)
Vorteile:
- immer auf aktuellem Sprachstand. Analyzer ist OPP+OP2 Modul
- Symboltabelle und Syntaxbaum vorhanden => mehr Checks und sicherere Analyse
Nachteile:
- V3 Gruppe
r gewisse F
lle immer noch zuwenig Information (intermediate Variables). W
rde Datenflussanalyse erfordern.
In OPT.Objekt hat es zwei Felder (adr, linkadr), welche nur vom back_end gebraucht werden. => Missbrauch f
r Position im Source und Nummer f
r usage.
Nach jeder Prozedur wird der Scope (lokale Objekte) nochmals durchlaufen und entsprechende Fehlermeldungen generiert, falls die usage_Nummer nicht ok ist.
Probleme:
a := a+1 oder INC(a) (* a used, then set *)
Naive Implementation: set before used! => Durchlaufen des Syntaxbaums und Sonderbehandlung auch von Var_Parametern!
a[i].b.c := 5; (* a used, i used, b used, c assigned *)
Durchlaufen des Syntaxbaums und nochmaliges 'parsen' von Designator.
Standart/System Prozeduren:
LEN(a) oder SYSTEM.ADR(a); (* used before set unterdr
cken! *)
SYSTEM.GETREG(a, 1); (* Var_Parameter *)
Optionen:
- Zus
tzliche Checks f
r intermediate objects. Zuweisung an / Zugriff auf Variablen in einem
usseren Scope. Deklaration von Objekten welche gleichen Namen in