Wie kann man nicht erreichbaren Code in der Perl-Bedingung erkennen, die immer als falsch ausgewertet wird?

8

Ich bin neu bei Perl und bin gerade damit beschäftigt, ein großes und ziemlich unordentliches Perl-Projekt aufzuräumen und zu warten. Ich benutze Perl-Kritiker, um mir zu helfen, Probleme im Code zu entdecken (und mir auch Best Practices beizubringen).

Der vorhandene Code enthält Stellen, an denen der Coder nicht erreichbaren Code erstellt hat. Zum Beispiel fügten sie '& amp; & amp; 0 'als eine faule Art, einige Code-Zweige zu kommentieren:

%Vor%

Ich hatte gehofft, dass Perl oder Critic mich in solchen Fällen vor unerreichbarem Code warnen würden (wo eine Bedingung einen konstanten Wert hat, der auf false auswertet), aber das tut es nicht.

Gibt es ein Werkzeug oder ein Skript, das ich verwenden könnte, um solche Dinge zuverlässig zu erkennen?

Natürlich könnte ich nach '& amp; & amp; 0 'in der Quelle, aber es gibt eine Reihe von Möglichkeiten, die der Coder nicht erreichbaren Code neben dem Anhängen von' & amp; & amp; 0 'zu einer if-Anweisung.

    
Josh Greifer 28.04.2014, 08:29
quelle

2 Antworten

9

Mit B :: Deparse können Sie in einigen Situationen nicht erreichbaren Code erkennen:

%Vor%

Es ist nicht so einfach, wenn die 0 nicht die erste Bedingung ist:

%Vor%

Warum ist das anders? Nun, wenn 0 zuletzt kommt, müssen alle Bedingungen überprüft werden. Sie können Nebenwirkungen haben, die noch passieren werden. Außerdem erzwingt && einen skalaren Kontext, sodass das Verhalten des aufgerufenen Codes bei der Auswertung der Bedingung geändert werden kann.

Das erklärt nicht, warum der Block selbst nicht kompiliert wird, sorry. Meine Vermutung wäre, es wäre einfach zu kompliziert.

    
choroba 28.04.2014 08:47
quelle
5

Laut chorobas Antwort wird B :: Deparse in der Lage sein, Fälle zu zeigen, in denen der Code so offensichtlich unerreichbar ist, dass der Perl-Compiler ihn optimiert. Aber im allgemeinen Fall ist es unmöglich zu erkennen. Der folgende Code enthält einen effektiv nicht erreichbaren Block.

%Vor%

Weil $] eine Variable ist, die die aktuell laufende Version von Perl zurückgibt, die durch die use -Zeile garantiert mindestens 5.006 beträgt. Aber Sie würden ein paar ziemlich clevere Techniken brauchen, um das herauszufinden, indem Sie eine statische Analyse des Quellcodes verwenden. (Nebenbei, obwohl eine ungewöhnliche Sache zu tun ist, ist es möglich, den Wert von $] zur Laufzeit zu ändern - siehe Acme :: Futuristic :: Perl - in diesem Fall wird der Code erreichbar.)

Wenn Sie eine anständige Testsuite für Ihren Code haben, kann Devel :: Cover nützlich sein. Sie setzen die Umgebungsvariable PERL5OPT auf -MDevel::Cover , führen dann Ihre Testsuite aus (beachten Sie, dass sie etwas langsamer als gewöhnlich läuft) und führen dann den Befehl cover aus, der einen hübschen HTML-Bericht erzeugt. In diesem Bericht wird hervorgehoben, welche Subs nicht ausgeführt wurden, welche Zweige nie verwendet wurden usw.

    
tobyink 28.04.2014 10:45
quelle

Tags und Links