Typbasierte Programmanalyse für Skriptsprachen
Zusammenfassung der Projektergebnisse
Zusammenfassend ist zu sagen, dass die ursprüngliche Zielsetzung der typbasierten Analyse von Skriptsprachen nicht zu einem praktisch einsetzbaren Werkzeug geführt hat. Entweder muss die Typanalyse so sehr vereinfacht werden, dass die Analyseergebnisse sehr unscharf sind, oder die von der Analyse ermittelten Strukturen sind so komplex, dass es für den Menschen schwer ist, sie zu interpretieren. Der letztere Fall trifft für die von uns entwickelte Analyse auf der Basis von recency types zu. Als bessere Alternative für Skriptsprachen hat sich eindeutig die dynamische Variante mit (Typ- und Zugriffs-) Verträgen, die zur Laufzeit geprüft werden, herausgestellt. Hierfür haben wir im Rahmen des Projekts umfangreiche Arbeiten durchgeführt und Werkzeuge entwickelt. Wir haben die folgenden Ideen im Kontext von dynamisch überprüften Verträgen entwickelt und für JavaScript implementiert. Vertrags-basiertes Testen: Unser zugehöriges Werkzeug JSContest erlaubt die Validierung von Typverträgen auf der Grundlage von informierten Zufallstests, ein ebenfalls von uns entwickeltes Verfahren. Informiert heißt dabei, dass die Zufallstests von Programmkonstanten gesteuert werden, so dass es sich um ein white box bzw. glass box Testverfahren handelt. Transaktionales Testen: Wir haben gezeigt, dass Transaktionen ein nützliches Hilfsmittel zur kostengünstigen Bereitstellung von Test-Fixtures sind. Hierdurch kann ein Neustart der JavaScript Engine für jeden Testfall vermieden werden. Access permission contracts: In Typsignaturen konnen Mengen von erlaubten Zugriffspfaden (auf JavaScript Objekte) spezifiziert werden. Zur Laufzeit wird sichergestellt, dass die erlaubten Zugriffspfade nicht verlassen werden. Hierfür haben wir eine effiziente, robuste und portable Implementierung auf der Basis von JavaScript Proxies entwickelt, sowie einen heuristischen Effekt-Inferenzalgorithmus, der dynamisch gesammelte Zugriffspfade auswertet. Abhängigkeitsanalyse: Dies ist eine statische Analyse, mit der sichergestellt werden kann, dass keine vertraulichen Daten veröffentlicht werden und dass Cross-Site-Scripting vermieden wird.
Projektbezogene Publikationen (Auswahl)
-
Contract-Driven Testing of JavaScript Code. TOOLS 2010:154-172
Phillip Heidegger, Peter Thiemann
-
DOM Transactions for Testing JavaScript. TAIC PART 2010:211-214
Phillip Heidegger, Annette Bieniusa, Peter Thiemann:
-
Recency Types for Analyzing Scripting Languages. ECOOP 2010:200-224
Phillip Heidegger, Peter Thiemann
-
A Heuristic Approach for Computing Effects. TOOLS 2011:147-162
Phillip Heidegger, Peter Thiemann
-
Access permission contracts for scripting languages. POPL 2012:111-122
Phillip Heidegger, Annette Bieniusa, Peter Thiemann
-
JSConTest: Contract-Driven Testing and Path Effect Inference for JavaScript. Journal of Object Technology (JOT) 11(1):1- 29 (2012)
Phillip Heidegger, Peter Thiemann
-
Efficient dynamic access analysis using JavaScript proxies. DLS 2013:49-60
Matthias Keil, Peter Thiemann
-
Type-based dependency analysis for JavaScript. PLAS 2013:47-58
Matthias Keil, Peter Thiemann