[Firm] Devirtualisierung und null Referenzen

Michael Beck mm.beck at gmx.net
Tue Apr 14 13:08:23 CEST 2015


On Tue, 14 Apr 2015 10:26:04 +0200, Andreas Zwinkau <zwinkau at kit.edu>  
wrote:

> 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?
>
> Von Sprachsemantik her ja. In C++ wäre es eh undefiniertes Verhalten.
> 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.
>
> 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.
>
> Meinungen?

Du darfst virtualisieren. u.U. ist sogar der segfault immer noch da (weil  
ja der this Zeiger
in foo() NULL ist) nur halt später. Da NULL-Zeiger Zugriff keine  
definierte Ausnahme in C++
ist, ist das eh implementationsspezifisch.
Selbst wenn Du Java nimmst, musst Du halt nur den NULL-Zeiger Check  
lassen, devirtualisieren darfst Du trotzdem.
If Firm selbst müsste Dein Frontent die NULL typisiert hinterlassen, damit  
es geht.

PS: Warum machst Du kein Undo und schaust in der alten RTA nach?
Oder verstößt das gegen den heiligen Grundsatz "was gelöscht wurde darf  
nicht wieder zurückgeholt werden" :D

-- 
Michael Beck



More information about the Firm mailing list