Saturday, February 05, 2011

Nützliche Module: B::Deparse und B::Concise

In OTRS habe ich heute morgen folgendes diff gefunden:
--- UnitTest.pm 2 Feb 2011 09:20:20 -0000 1.46
+++ UnitTest.pm 4 Feb 2011 23:37:31 -0000 1.47
@@ -265,4 +265,7 @@
}
}
+ elsif ( system 'uname -s' eq 'FreeBSD' ) {
+ $ResultSummary{Vendor} = 'FreeBSD ' . system 'uname -r';
+ }
else {
$ResultSummary{Vendor} = 'unknown';
Da sind bei mir gleich alle Alarmglocken angesprungen - das kann nicht funktionieren. Schon allein dass "system" das Ergebnis (sprich: die Ausgabe) des ausgeführten Kommandos nicht zurückliefert.

Um aber dem Autor des Codes zu zeigen, was tatsächlich passiert, kann man B::Deparse und B::Concise nehmen. Für den Test habe ich dann einen Einzeiler genommen, der aber genau den Code oben abbildet.

B::Concise

$ perl -MO=Concise,-exec -e 'print "yes\n" if system "uname -s" eq "Linux"'
1 <0> enter
2 <;> nextstate(main 1 -e:1) v
3 <0> pushmark s
4 <$> const[SPECIAL sv_no] s
5 <@> system[t2] sK
6 <|> and(other->7) vK/1
7 <0> pushmark s
8 <$> const[PV "yes\n"] s
9 <@> print vK
a <@> leave[1 ref] vKP/REFC
-e syntax OK

Das zeigt gleich noch ein anderes Problem: Präzedenz! Das "eq" wird vor dem "system" ausgeführt. Das "eq" liefert "unwahr" (sv_no) und übergibt das an "system". Ein "system sv_no" funktioniert immer - jedenfalls unter Ubuntu...

Aber was wird dann tatsächlich ausgeführt? Das kann man sich mit B::Deparse anschauen:

$ perl -MO=Deparse -e 'print "yes\n" if system "uname -s" eq "Linux"'
print "yes\n" if system !1;
-e syntax OK

Wie man sieht können die beiden Module sehr gut dabei helfen, Probleme zu identifizieren. Über ein paar B::*-Module habe ich übrigens in der Frühjahr 2009 Ausgabe von $foo geschrieben und darüber wie B::Concise bei Präzendenz-Problemen hilf in der Sommer 2008 Ausgabe.

3 comments:

Uwe said...

Und das ist der Grund, warum ich damals RT installiert habe. :)

Ich hatte bei einer Datumsbehandlung einen so falschen regulären Ausdruck gefunden, daß ich auf der Stelle jedes Vertrauen in das Produkt verloren habe.

Wie man sieht, hat sich bei OTRS noch nichts geändert... :)

ReneeB said...

Weißt Du noch was das mit der Datumsbehandlung genau war?

Uwe said...

Nein, Details habe ich mir nicht gemerkt. Irgendein Regex, der zwar erst eingeschraenkt hat, dann aber doch alles gematcht hat. Oder so aehnlich. :)