Rasmus Lerdorf hat einen experimentellen Static Analyzer veröffentlicht

Phan: PoC eines statischen Analyzers für PHP
Kommentare

Rasmus Lerdorf hat mit Phan einen statischen Analyzer für PHP-7-Code veröffentlicht. Eigenen Aussagen zufolge handelt es sich dabei um einen „brute-force approach hacked together quickly“.

Rasmus Lerdorf dürfte uns allen als Vater von PHP ein Begriff sein. Jetzt, zwanzig Jahre nach der Veröffentlichung der ersten Version, steht der mit PHP 7 ein großer Quantensprung vor der Tür. Im Vorfeld des mittlerweile in Version Alpha 2 vorliegenden Major-Releases hat er nun mit Phan einen ersten Entwurf eines statischen Code-Analyzers veröffentlicht.

Phan

Bei Phan handelt es sich um einen statischen Code-Analyzer, der in der Lage ist, Code zu analysieren, der für beliebige PHP-Versionen geschrieben wurde.

Vieler Worte bedurfte es nicht – mit einem knappen Tweet hat Lerdorf Phan der Öffentlichkeit vorgestellt:

PHP 7 als Mindestanforderung

Als Voraussetzung für Phan benötigt man eine Installation von PHP 7 sowie die Abstract-Syntax-Tree-Extensions php-ast. Sie, so Lerdorf, ermögliche es, Schritt für Schritt durch den Code zu navigieren und ihn so zu analysieren. Das ist jedoch nur die Voraussetzung dafür, Phan in Betrieb zu nehmen – für die Analyse spiele es keine Rolle, für welche PHP-Version der zu überprüfende Code geschrieben wurde.

Phan arbeitet in zwei Schritten: Zunächst werden alle zu analysierenden Dateien gelesen und globale Hashes von Funktionen, Methoden und Klassen gebildet. Darüber hinaus werden Definitionen für alle internen Funktionen und Klassen geladen, deren Typinformationen aus einer einzigen, großen Datei geladen werden. Im zweiten Schritt wird es dann jedoch richtig spannend:

The real complexity hits you hard in Pass2. Here some things are done recursively depth-first and others not. For example, we catch something like foreach($arr as $k=>$v) because we need to tell the foreach code block that $k and $v exist. For other things we need to recurse as deeply as possible into the tree before unrolling our way back out. For example, for something like c(b(a(1))) we need to call a(1) and check that a() actually takes an int, then get the return type and pass it to b() and check that, before doing the same to c().

Die vollständige Erklärung der Funktionsweise findet man übrigens im GitHub-Repository von Phan.

Features und Ausblick

Die Feature-Liste kann sich durchaus sehen lassen – und das, obwohl Lerdorf selbst zu bedenken gibt, dass Phan noch nicht einmal ansatzweise bereit sei für den produktiven Einsatz.

So trackt das Tool selbst undefinierte Variablen, unterstützt PHPDoc-Kommentare, Namespaces, Traits und Variadic Functions. Einzig die Kombination aus Traits und Namespaces machen Phan noch zu schaffen.

Auf der Liste der geplanten Features stehet noch das Mapping von Namespaces, die Implementierung verschiedener Ausgabeformate, ein Arry-Element-tracking sowie die Prüfung von Klasseneigenschaften und Konstanten.

Lerdorf selbst sieht Phan als Proof-of-Concept. Es solle einzig und allein als Inspiration gedacht, die andere anregen solle, selbst einen statischen Analyzer zu schreiben – der Bedarf dafür besteht auf alle Fälle:

We need a practical and pragmatic analyzer that we can just point at a bunch of code and have it tell us about any issues in it.

 

 

Aufmacherbild: Spark from electric static jumping between two thumb. von Shutterstock / Urheberrecht: Gwoeii

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -