ZSyntax10.Scn.Fnt ZParcElemsAlloc Syntax14b.Scn.FntFSyntax14.Scn.Fnt D TableElemsAlloc#Syntax14.Scn.FntWW/nolines"*"/nohead"*"/table Modul Statements OPP 1108 OP2 135 Summe 1243 Analyzer 1442    Syntax14i.Scn.Fnt(# Z @X@tSyntax10.Scn.FntParcElemsAllocSyntax14.Scn.Fnt/col"LCCCC"/table 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) k 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 verstndlich. - 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 mglich (v.a. wenn es distributiert wird). Langsamere Compilation. Implementation: Diplomarbeit bei Karl Rege. Source war schwer lesbar und war nicht fr 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 - fr gewisse Flle immer noch zuwenig Information (intermediate Variables). Wrde Datenflussanalyse erfordern. In OPT.Objekt hat es zwei Felder (adr, linkadr), welche nur vom back_end gebraucht werden. => Missbrauch fr Position im Source und Nummer fr usage. Nach jeder Prozedur wird der Scope (lokale Objekte) nochmals durchlaufen und entsprechende Fehlermeldungen generiert, falls die usage_Nummer nicht ok ist. Grsse:   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 unterdrcken! *) SYSTEM.GETREG(a, 1); (* Var_Parameter *)  Optionen: - Zustzliche Checks fr intermediate objects. Zuweisung an / Zugriff auf Variablen in einem usseren Scope. Deklaration von Objekten welche gleichen Namen in usserem Scope haben. - Anzahl Statements (assignment, proc call, if, while, etc.) als genaues Komplexittsmass. - Markieren von redefinierten Methoden (da es kein REDEFINE gibt, Wink mit dem ...). - Analyse auch fr exportierte Objekte. Beispiele: Oberon System:  Interessiert? Net.ReceiveFiles Pluto shml:Analyzer.Tool~ Auch bei Portierungen vorhanden (ausser DOS)