8

私は Perl に不慣れで、現在、大規模でかなり面倒な Perl プロジェクトの整理と保守を任されています。私は perl-critic を使用して、コードの問題を検出するのに役立てています (また、ベスト プラクティスを教えてくれます)。

既存のコードには、コーダーが到達不能なコードを作成した場所があります。たとえば、コード ブランチの一部をコメント アウトする怠惰な方法として、「&& 0」を追加しました。

if ($req->param('donut') && 0) {
    unreachable code... 
} else {
    always branches to here...
}

perl または Critic が、そのような場合 (条件が false に評価される定数値を持つ場合) に到達できないコードについて警告してくれることを期待していましたが、そうではありません。

この種のものを確実に検出できる、使用できるツールまたはスクリプトはありますか?

明らかに、ソースで '&& 0' を検索できますが、コード作成者が if ステートメントに '&& 0' を追加する以外にも、到達不能なコードを作成する方法がいくつかあります。

4

2 に答える 2

9

B::Deparseを使用すると、特定の状況で到達不能なコードを検出できます。

perl -MO=Deparse -e 'if (0 && $x) {print 1} else {print 2}'
do {
    print 2
};
-e syntax OK

ただし、0 が最初の条件でない場合は、それほど簡単ではありません。

perl -MO=Deparse -e 'if ($x && 0) {print 1} else {print 2}'
if ($x and 0) {
    print 1;
}
else {
    print 2;
}
-e syntax OK

なぜ違うのですか?0 が最後に来る場合は、それ以前のすべての条件をチェックする必要があります。彼らはまだ起こる副作用を持つことができます. また、&&スカラー コンテキストを強制するため、条件の評価時に呼び出されるコードの動作を変更できます。

これは、ブロック自体がコンパイルされない理由を説明していません。申し訳ありません。私の推測では、それはあまりにも複雑に思えました。

于 2014-04-28T08:47:54.933 に答える