Der Einsatz von Pr{\"a}prozessoren in Programmiersprachen stellt ein bedeutendes Problem in der Softwaretechnik dar. Durch textuelle Transformationen, durch die Inklusion externer Quelltexte und durch tief verschachtelte komplexe Bedingungen wird das Begreifen von Zusammenh{\"a}ngen und die Inspektion bestehender Systeme erschwert. Detailliertes Verst{\"a}ndnis bestehender Software ist jedoch die Voraussetzung nahezu aller Aktivit{\"a}ten im Software-Lebenszyklus: Implementation, Test, Wartung, Pflege und Weiterentwicklung von Softwaresystemen erfordern die Analyse von Quelltexten in Gegenwart von Pr{\"a}prozessor-Anweisungen. Die Pr{\"a}prozessor-Problematik wird damit zu einer wesentlichen Fragestellung im Reverse Engineering und beim Programmverstehen. Bei einer bisher nur unscharfen Pr{\"a}prozessor-Terminologie schafft diese Arbeit zun{\"a}chste eine begriffliche Grundlage zur Diskussion der Pr{\"a}prozessor-Problematik. Der Fokus im pr{\"a}prozessor-bezogenen Reverse Engineering lag bisher lediglich auf dem C-Pr{\"a}prozessor. Andere weit verbreitete Programmiersprachen blieben unber{\"u}cksichtigt. In dieser Arbeit werden die Pr{\"a}prozessoren der Sprachen C/C++, COBOL und PL/I vergleichend untersucht und hinsichtlich ihrer F{\"a}higkeiten zur Manipulation des Pr{\"a}prozessor-Input in einen gemeinsamen Rahmen gestellt. Zahlreiche Programmbeispiele illustrieren die durch Pr{\"a}prozessoren induzierten Probleme im Reverse Engineering und beim Programmverstehen. Das Verst{\"a}ndnis f{\"u}r die Problemkreise der Textersetzung, der Datei-Inklusion und der Einfl{\"u}sse der Systemumgebung wird damit vertieft und die Notwendigkeit einer Werkzeugunterst{\"u}tzung wird motiviert. Mit einem sprachunabh{\"a}ngigen Repository-Schema wird ein Rahmen f{\"u}r die Repr{\"a}sentation von Pr{\"a}prozessor-Fakten entwickelt. Dieses Schema erlaubt eine von der konkreten Programmiersprache und deren speziellen Verarbeitungsregeln unabh{\"a}ngige Repr{\"a}sentation von Pr{\"a}prozessor-Aktionen in Fold-Graphen. Schlie{\ss}lich werden aufbauend auf diesem Repository-Schema graphbasierte Algorithmen und Werkzeuge realisiert, die in der generischen Umgebung zum Programmverstehen GUPRO die Kluft zwischen Pr{\"a}prozessor-Input und Pr{\"a}prozessor-Output {\"u}berbr{\"u}cken. Der von der GUPRO-Umgebung unabh{\"a}ngige Fold-Graph-Viewer erm{\"o}glicht die interaktive Analyse, Visualisierung und Erkundung von Programmen in Gegenwart von Pr{\"a}prozessor-Anweisungen. Abstract: The use of preprocessors in programming languages contributes to major problems in software technology. Recognition of the various interrelations and inspection of source code is hampered by textual transformations, inclusion of external source code and deeply nested conditional compilation. Yet, detailed knowledge of existing software is an indispensible pre-requisite for almost every activity in the software life cycle: implementation, testing, maintenance, and evolution of software systems require the analysis of source code in the presence of preprocessor statements. For this reason, preprocessor problems raise essential questions in the fields of program comprehension and reverse engineering. In this work, a terminology of preprocessor related concepts establishes the foundation for the discussion of preprocessor problems. Up to now, reverse engineering focused mainly on the C preprocessor as object of investigation. The use of other widespread preprocessor languages has been ignored. In this work the preprocessor languages of C/C++, COBOL and PL/I are compared and put into a common framework. Numerous code examples illustrate the issues introduced by preprocessors in reverse engineering and program comprehension. This deepens the understanding of the effects of text replacement, file inclusion and the influence of the system environment, and motivates the demand for tool support. Based on these problem domains, a language independent repository schema for preprocessor facts is developed. This schema permits the representation of preprocessor actions in fold graphs, which are independent from a concrete programming language and its specific processing rules. Finally, graph-based algorithms and tools based upon this repository structure are implemented in the GUPRO environment for generic understanding of programs. These tools are capable of bridging the gap between preprocessor input and preprocessor output in real word applications. The self-contained application Fold Graph Viewer enables interactive analysis, visualization and exploration of programs in the presence of preprocessor constructs.
Abstract @phdthesis{Riediger2004DPI,
author = {Riediger, Volker},
title = {Die Pr{\"a}prozessor-Problematik im Reverse Engineering und beim Programmverstehen},
year = {2004},
school = {Universit{\"a}t Koblenz-Landau},
abstract = {Der Einsatz von Pr{\"a}prozessoren in Programmiersprachen stellt ein bedeutendes Problem in der Softwaretechnik dar. Durch textuelle Transformationen, durch die Inklusion externer Quelltexte und durch tief verschachtelte komplexe Bedingungen wird das Begreifen von Zusammenh{\"a}ngen und die Inspektion bestehender Systeme erschwert. Detailliertes Verst{\"a}ndnis bestehender Software ist jedoch die Voraussetzung nahezu aller Aktivit{\"a}ten im Software-Lebenszyklus: Implementation, Test, Wartung, Pflege und Weiterentwicklung von Softwaresystemen erfordern die Analyse von Quelltexten in Gegenwart von Pr{\"a}prozessor-Anweisungen. Die Pr{\"a}prozessor-Problematik wird damit zu einer wesentlichen Fragestellung im Reverse Engineering und beim Programmverstehen. Bei einer bisher nur unscharfen Pr{\"a}prozessor-Terminologie schafft diese Arbeit zun{\"a}chste eine begriffliche Grundlage zur Diskussion der Pr{\"a}prozessor-Problematik. Der Fokus im pr{\"a}prozessor-bezogenen Reverse Engineering lag bisher lediglich auf dem C-Pr{\"a}prozessor. Andere weit verbreitete Programmiersprachen blieben unber{\"u}cksichtigt. In dieser Arbeit werden die Pr{\"a}prozessoren der Sprachen C/C++, COBOL und PL/I vergleichend untersucht und hinsichtlich ihrer F{\"a}higkeiten zur Manipulation des Pr{\"a}prozessor-Input in einen gemeinsamen Rahmen gestellt. Zahlreiche Programmbeispiele illustrieren die durch Pr{\"a}prozessoren induzierten Probleme im Reverse Engineering und beim Programmverstehen. Das Verst{\"a}ndnis f{\"u}r die Problemkreise der Textersetzung, der Datei-Inklusion und der Einfl{\"u}sse der Systemumgebung wird damit vertieft und die Notwendigkeit einer Werkzeugunterst{\"u}tzung wird motiviert. Mit einem sprachunabh{\"a}ngigen Repository-Schema wird ein Rahmen f{\"u}r die Repr{\"a}sentation von Pr{\"a}prozessor-Fakten entwickelt. Dieses Schema erlaubt eine von der konkreten Programmiersprache und deren speziellen Verarbeitungsregeln unabh{\"a}ngige Repr{\"a}sentation von Pr{\"a}prozessor-Aktionen in Fold-Graphen. Schlie{\ss}lich werden aufbauend auf diesem Repository-Schema graphbasierte Algorithmen und Werkzeuge realisiert, die in der generischen Umgebung zum Programmverstehen GUPRO die Kluft zwischen Pr{\"a}prozessor-Input und Pr{\"a}prozessor-Output {\"u}berbr{\"u}cken. Der von der GUPRO-Umgebung unabh{\"a}ngige Fold-Graph-Viewer erm{\"o}glicht die interaktive Analyse, Visualisierung und Erkundung von Programmen in Gegenwart von Pr{\"a}prozessor-Anweisungen. Abstract: The use of preprocessors in programming languages contributes to major problems in software technology. Recognition of the various interrelations and inspection of source code is hampered by textual transformations, inclusion of external source code and deeply nested conditional compilation. Yet, detailed knowledge of existing software is an indispensible pre-requisite for almost every activity in the software life cycle: implementation, testing, maintenance, and evolution of software systems require the analysis of source code in the presence of preprocessor statements. For this reason, preprocessor problems raise essential questions in the fields of program comprehension and reverse engineering. In this work, a terminology of preprocessor related concepts establishes the foundation for the discussion of preprocessor problems. Up to now, reverse engineering focused mainly on the C preprocessor as object of investigation. The use of other widespread preprocessor languages has been ignored. In this work the preprocessor languages of C/C++, COBOL and PL/I are compared and put into a common framework. Numerous code examples illustrate the issues introduced by preprocessors in reverse engineering and program comprehension. This deepens the understanding of the effects of text replacement, file inclusion and the influence of the system environment, and motivates the demand for tool support. Based on these problem domains, a language independent repository schema for preprocessor facts is developed. This schema permits the representation of preprocessor actions in fold graphs, which are independent from a concrete programming language and its specific processing rules. Finally, graph-based algorithms and tools based upon this repository structure are implemented in the GUPRO environment for generic understanding of programs. These tools are capable of bridging the gap between preprocessor input and preprocessor output in real word applications. The self-contained application Fold Graph Viewer enables interactive analysis, visualization and exploration of programs in the presence of preprocessor constructs. },
}
BibTeX