[Firm] Devirtualisierung und null Referenzen

Christoph Mallon mallon at cs.uni-saarland.de
Tue Apr 14 10:52:28 CEST 2015


Hallo!

Am 14.04.15 10:26, schrieb Andreas Zwinkau:
 > Ein Student arbeitet gerade an einer Devirtualisierungs-Optimierung
 > via Rapid Type Analysis (RTA). Folgender Randfall:
 >
 > class A {
 >      void foo() {}
 > }
 > A a = null;
 > a.foo();
 >
 > Offensichtlich lässt sich der Aufruf von foo Devirtualisieren sagt die
 > RTA, weil es keine Unterklasse von A gibt. Aber: Damit verschwindet
 > der Segfault der hier passieren würde.
 >
 > Darf man devirtualisieren oder nicht?

Ersteres.

 > Von Sprachsemantik her ja. In C++ wäre es eh undefiniertes Verhalten.

Ja.

 > In Java muss ich sowieso einen null pointer check einfügen. Soweit ich
 > weiß definiert keine Programmiersprache was bei null pointer
 > dereferenzierung passiert. Einzige Ausnahme: Java implementiert den
 > null pointer check via Segfault und signal handler.

Das ist aber nur ein Implementierungsdetail wie der Nullzeigertest 
(schnell) implementiert wird (da die meisten Referenzen eben nicht null 
sind).

 > Zu Debug und ähnliches Zwecken möchte man Segfaults erhalten, aber das
 > bedeutet man darf nur devirtualisieren, wenn man "this != null"
 > garantieren kann, also vermutlich so gut wie nie.

* Schon ab dem zweiten Aufruf auf dem selben Adressknoten weiß man, dass 
eine Adresse nicht Null sein kann.
Außerdem hat man einfach Pech gehabt, wenn das weg-devirtualisiert wurde.

* Wir lassen auch diversen anderen Kram beim Optimieren verschwinden und 
dann explodiert weniger.

* Zudem weiß man bei C++ fast nie, dass etwas keine Unterklassen hat, 
außer die Welt ist hohl.

* Der Constbits wollte ich sowieso schon mal eine Nicht-Null-Domäne 
schenken.
Das könnte hierfür nützlich sein.
Vielleicht möchte das dein Student da reinbasteln.

* Dann könnte man auch etwas mit einem interprozeduralen Hammer für 
reingereichte Zeiger draufhauen.
Dann muss man auf dem ganzen Aufrufgraphen vor sich hin 
fixpunktiterieren, was allerdings noch zu implementieren wäre.

Gruß
	Christoph



More information about the Firm mailing list