Syntax10.Scn.Fnt ParcElems Alloc Syntax14b.Scn.Fnt Syntax14.Scn.Fnt TableElems Alloc Syntax14.Scn.Fnt /nolines"*"/nohead"*"/table Modul Statements OPP 1108 OP2 135 Summe 1243 Analyzer 1442 Syntax14i.Scn.Fnt Syntax10.Scn.Fnt ParcElems Alloc Syntax14.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) 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 usserem Scope haben. - Anzahl Statements (assignment, proc call, if, while, etc.) als genaues Komplexit tsmass. - Markieren von redefinierten Methoden (da es kein REDEFINE gibt, Wink mit dem ...). - Analyse auch f r exportierte Objekte. Beispiele: Oberon System: Interessiert? Net.ReceiveFiles Pluto shml:Analyzer.Tool~ Auch bei Portierungen vorhanden (ausser DOS)