Im Rahmen dieser Diplomarbeit wird das Dienstmodell für Program Slicing, welches von
Hannes Schwarz in [Sch07] vorgestellt wurde, zu einem komponentenbasierten Referenztool
weiterentwickelt und implementiert.
Dieses Referenztool verwendet zum Slicen ein Referenzschema für Programmiersprachen,
welches ebenfalls in dieser Arbeit eingeführt wird. Die hier eingesetzten Slicing-Verfahren
basieren auf diesem Referenzschema. Somit kann das Referenztool als Grundlage zum Slicen
von Quellcode in beliebigen Programmiersprachen genutzt werden, wenn das Referenzschema
vorab an die Gegebenheiten dieser Sprachen angepasst wird.
Exemplarisch wird in dieser Diplomarbeit ein Program Slicing Tool für C-Quellcode entwickelt.
Dieses Slicing Tool basiert auf dem Referenztool, in dem es die einzelnen Komponenten
des Referenztools bei Bedarf spezialisiert oder in der ursprünglichen Form übernimmt.
Damit das Program Slicing Tool als Referenz gelten kann, wird in dieser Arbeit eine einfache,
erweiterbare und komponentenbasierte Architektur entwickelt. Diese entsteht durch
den Einsatz aktueller Prinzipien der Softwaretechnik.
Inhaltsverzeichnis
1. Einleitung
1.1. Motivation
1.2. Ziel der Diplomarbeit
2. Grundlagen
2.1. Program Slicing
2.1.1. Statisches Slicen
2.1.2. Datenfluss der Slicing-Dienste
2.2. TGraph
2.2.1. TGraph Eigenschaften
2.2.2. Schema
2.3. Referenzschema
3. Entwicklung eines Referenzschemas für Programmiersprachen
3.1. Entwicklung des Referenzschemas
3.2. Erweiterung des EL-Schemas zum Referenzschema
3.3. Abbildung des C-Schemas auf das Referenzschema
3.3.1. Direkte Abbildungen vom RePSS auf das C-Schema
3.3.2. Klassen des C-Schemas und von RePSS ohne Abbildung
3.3.3. Unterschiede zwischen dem C-Schema und RePSS
3.3.4. Kantenklassen im C-Schema und in RePSS
3.4. Datenmodelle des C-Schemas
3.4.1. Abstrakter Syntaxgraph (ASG) für C
3.4.2. Erweiterter Kontrollflussgraph (ACFG) für C
3.4.3. Points-to-Graph (PG) für C
3.4.4. Aufrufgraph (CG) und erweiterter Aufrufgraph (ECG) für C
3.4.5. Erweiterter Systemabhängigkeitsgraph (ESDG) für C
3.5. Fazit zu RePSS
4. Definition von RePST
4.1. Anwendungsfälle
4.2. Anforderungen
4.2.1. Funktionale Anforderungen
4.2.2. Technische Anforderungen
4.2.3. Anforderungen an die Architektur
4.2.4. Qualitätsanforderungen
4.2.5. Anforderungen an die Benutzerschnittstelle
4.2.6. Anforderungen an die Dokumentation
5. Architektur
5.1. Architektur-Muster
5.2. Architektur Eigenschaften von RePST
5.3. Architektur der Komponente ProgramSlicingTool
5.4. Architektur der Komponente ProgramPreprocessor
5.5. Architektur der Komponente ProgramSlicer
5.6. Konfiguration von RePST
5.7. Verwendung gemeinsamer Komponenten
6. Realisierung der Komponenten
6.1. ProgramSlicingTool
6.2. ProgramPreprocessor
6.3. ASGComputer
6.4. ACFGComputer
6.5. PGComputer
6.6. ECGComputer
6.7. CGComputer
6.8. DefUseInfComputer
6.9. ESDGComputer
6.10. BasicESDGComputer
6.11. IntMetEdgesComputer
6.12. ConDepEdgesComputer
6.13. DataFlowEdgesComputer
6.14. SumEdgesComputer
6.15. ProgramSlicer
6.16. ESDGMarker
6.17. StaticBackwardSliceComputer
6.18. StaticForwardSliceComputer
6.19. Weitere Slice- und ChopComputer
6.20. ESDGToCodeConverter
6.21. ProgramSlicingComponent
6.22. SharedComponent
6.23. GReQLAdapter
7. Implementation
7.1. TGraph-Anfragen
7.1.1. Anfragen mit GReQL2
7.1.2. Algorithmen mit dem RePSS-API
7.1.3. Bewertung der TGraph-Anfragen
7.1.4. GReQL2-Nutzung in RePST
7.2. Unittests gegen ein C-Testprogramm
7.2.1. Testprogramm
7.2.2. ASGComputerForCTest
7.2.3. ACFGComputerForCTest
7.2.4. PGComputerForCTest
7.2.5. CGComputerForCTest
7.2.6. DefUseInfComputerForCTest
7.2.7. BasicESDGComputerForCTest
7.2.8. IntMetEdgesComputerForCTest
7.2.9. ConDepEdgesComputerForCTest
7.2.10. DataFlowEdgesComputerForCTest
7.2.11. SumEdgesComputerForCTest
7.2.12. ESDGMarkerForCTest
7.2.13. StaticBackwardSliceComputerForCTest
7.2.14. StaticForwardSliceComputerForCTest
7.2.15. ESDGToCodeConverterForCTest
7.3. Ausnahmebehandlung
7.3.1. Exception-Hierarchie in RePST
7.3.2. Mögliche Auslöser der ProgramSlicingToolExceptions
7.4. Installation von RePST
7.5. Die Benutzungsoberfläche von RePST
7.6. Steuerung von RePST per Konsole
7.7. API von RePST
8. Fazit
8.1. Bewertung
8.1.1. Bewertung: Funktionale Anforderungen
8.1.2. Bewertung: Technische Anforderungen
8.1.3. Bewertung: Anforderungen an die Architektur
8.1.4. Bewertung: Qualitätsanforderungen
8.1.5. Bewertung: Anforderungen an die Benutzerschnittstelle
8.1.6. Bewertung: Anforderungen an die Dokumentation
8.2. Weiterentwicklung
8.2.1. Program Slicing von Quellcode in anderen Programmiersprachen
8.2.2. Alternative Slicing- und Chopping-Verfahren
8.2.3. PGComputer
8.2.4. Implementierung der abstrakten RePST-Komponenten
8.2.5. Program Slicing für C-Programme
8.2.6. Integration in fremde Umgebungen
8.3. Zusammenfassung
Zielsetzung & Themen
Ziel dieser Arbeit ist die Entwicklung und Implementierung eines komponentenbasierten, adaptierbaren Referenztools (RePST) für das Program Slicing nach einem spezifischen Dienstmodell. Das Tool soll so allgemein gestaltet sein, dass Program Slicing für eine Vielzahl von Programmiersprachen durch die Definition entsprechender Referenzschemata ermöglicht wird, wobei das Slicen von C-Quellcode exemplarisch realisiert wird.
- Entwicklung eines Referenzschemas für Program Slicing (RePSS)
- Implementierung einer komponentenbasierte Software-Architektur
- Exemplarische Adaption und Anpassung für die Programmiersprache C
- Verwendung von Graph-Datenmodellen und Graphen-Technologien
- Qualitätssicherung durch Unittests und Evaluation des Software-Entwicklungsprozesses
Auszug aus dem Buch
2.1. Program Slicing
Program Slicing wurde 1979 in Weisers Dissertation [Wei79] eingeführt. Die deutsche Übersetzung „ein Programm in Scheiben schneiden“ [Sch07] beschreibt, was Programmierer laut Weisers Studie [Wei82] im Kopf tun, wenn sie ein Programm debuggen. So zerlegt oder schneidet der Programmierer den Quellcode in kleinere Teile, die nur die relevanten Stellen des Codes enthalten. Diese Teile können dann auch als Scheiben des Quellcodes betrachtet werden.
Die Reduzierung des Quellcodes auf die relevanten Stellen geschieht beim Program Slicing in Abhängigkeit von einem Slicing-Kriterium. Dieses Kriterium variiert je nach angewendetem Slicing-Verfahren. Im ursprünglichen Verfahren besteht es jedoch aus einer bestimmten Stelle im Quellcode und einer Teilmenge aller Variablen des Quellcodes.
Die hier implementierten statischen Slicing-Verfahren verwenden ein Slicing-Kriterium SliceCrit = , wobei i für eine Anweisung im Quellcode steht und X eine Variablenmenge festlegt. Eine Slice ist nun ein Ausschnitt des Quellcodes, welche aus Streichungen von Anweisungen im ursprünglichen Quellcode hervorgeht. Diese Streichungen basieren auf der Traversierung des erweiterten Systemabhängigkeitsgraphen (ESDG). Beim Rückwärtsslicen wird ausgehend von der Anweisung i rückwärts traversiert; analog dazu wird beim Vorwärtsslicen vorwärts traversiert. Während der Traversierung werden alle Anweisungen gestrichen, die keine Abhängigkeiten zu den Variablen in der Menge X besitzen.
Zusammenfassung der Kapitel
1. Einleitung: Beschreibt die Motivation für komponentenbasierte Program Slicing Werkzeuge und definiert das Ziel der Arbeit, ein entsprechendes Dienstmodell zu implementieren.
2. Grundlagen: Erläutert die theoretischen Konzepte von Program Slicing, TGraphen und die Definition von Referenzschemata als Basis für die Arbeit.
3. Entwicklung eines Referenzschemas für Programmiersprachen: Detailliert die Erweiterung eines existierenden Schemas zu einem allgemeinen Referenzschema (RePSS) und die Abbildung des C-Schemas darauf.
4. Definition von RePST: Beschreibt die Definitionsphase mit Anforderungsanalyse, Anwendungsfällen und Kategorisierung der funktionalen sowie technischen Anforderungen an das System.
5. Architektur: Stellt das Architektur-Muster "Call-Return" sowie die komponentenbasierte Architektur von RePST und deren Konfiguration vor.
6. Realisierung der Komponenten: Erläutert detailliert die Implementierung der einzelnen Komponenten wie ASGComputer, ACFGComputer und anderer Dienste zur Realisierung des Slicing-Prozesses.
7. Implementation: Beschreibt die technische Umsetzung, den Einsatz von GReQL2-Anfragen, Unittests gegen ein C-Testprogramm und die Schnittstellen des Systems.
8. Fazit: Bewertet die erreichten Ergebnisse anhand der Anforderungen und skizziert Möglichkeiten für zukünftige Weiterentwicklungen.
Schlüsselwörter
Program Slicing, Referenzschema, RePST, RePSS, Komponentenbasierte Architektur, C-Programmierung, Systemabhängigkeitsgraph, TGraph, GReQL2, Softwaretechnik, Dienstmodell, statisches Slicing, Datenflussanalyse, Compilerbautechniken
Häufig gestellte Fragen
Worum geht es in der vorliegenden Diplomarbeit?
Die Arbeit befasst sich mit der Entwicklung und Implementierung eines komponentenbasierten Referenztools für das Program Slicing, welches auf einem flexiblen Dienstmodell basiert.
Was sind die zentralen Themenfelder?
Zentrale Themen sind die Entwicklung eines allgemeinen Referenzschemas für Programmiersprachen, eine komponentenbasierte Software-Architektur und die beispielhafte Anpassung dieser Konzepte für die Programmiersprache C.
Was ist das primäre Ziel der Forschungsarbeit?
Das primäre Ziel ist es, ein Tool (RePST) zu schaffen, das Program Slicing für verschiedene Sprachen ermöglicht, indem es die gemeinsame Funktionalität in einem Referenzschema (RePSS) kapselt und durch Spezialisierung für spezifische Sprachen (wie C) erweiterbar macht.
Welche wissenschaftlichen Methoden werden verwendet?
Es werden Ansätze der komponentenbasierten Softwareentwicklung, Graphentechnologien zur Darstellung von Programmcode sowie formale Spezifikationen und Modellierungssprachen verwendet.
Was wird im Hauptteil der Arbeit behandelt?
Der Hauptteil umfasst die Entwicklung des Referenzschemas, die detaillierte Architektur des Slicing-Tools, die Implementierung der einzelnen Softwarekomponenten und deren Validierung durch Unittests.
Welche Schlüsselwörter charakterisieren die Arbeit?
Die wichtigsten Begriffe sind Program Slicing, RePST, Referenzschema, Systemabhängigkeitsgraph (ESDG) und komponentenbasiertes Design.
Inwiefern ist das entwickelte System für andere Programmiersprachen nutzbar?
Das System ist modular aufgebaut. Um eine neue Sprache zu unterstützen, muss lediglich eine Abbildung zwischen dem allgemeinen Referenzschema RePSS und dem spezifischen Schema der neuen Sprache erstellt und die entsprechenden Komponenten spezialisiert werden.
Warum wurde GReQL2 zur Analyse der Graphen eingesetzt?
GReQL2 wurde gewählt, um Anfragen an die internen Graphen-Strukturen (TGraphen) effizient und formal fundiert zu formulieren, was eine präzise Informationsgewinnung für das Slicing ermöglicht.
- Quote paper
- Elmar Brauch (Author), 2008, Program Slicing - Ein komponentenbasiertes und adaptierbares Referenztool, exemplarisch angepasst für C, Munich, GRIN Verlag, https://www.grin.com/document/90901