Checkstyle 4.4 RegExpチェックによるStackOverflowError

checkstyle regex
Checkstyle 4.4 RegExpチェックによるStackOverflowError

こんにちは、

バックグラウンド:

CheckStyle 4.4.2とRegExpチェッカーモジュールを使用して、出力Javaソースヘッダーのファイル名が、それらが存在するクラスまたはインターフェイスのファイル名と一致しないことを検出しています。 これは、開発者がヘッダーをあるクラスから別のクラスにコピーし、「File:」タグを変更しない場合に発生する可能性があります。

RexExpチェッカーでの正規表現の使用は、多くの化身を通じて行われており、(この時点では多すぎるかもしれませんが)このように見えます:

File: (\w+)\.java\n(?:.*\n)*?(?:[\w|\s]*?(?: class | interface )\1)

チェックしているファイルの基本形式(非常に単純化されていますが)は次のようになります

/*
 *
 *  Copyright 2009
 *  ...
 *  File: Bar.java
 *  ...
 */
package foo
...
import ..
...
/**
 * ...
 */
public class Bar
{...}

問題:

一致が見つからない場合、(つまり 「File:Bar.java」を含むヘッダーがファイルBat.javaにコピーされると、非常に長いファイルでStackOverflowErrorを受け取ります(私のテストケースは@ 1300行です)。

いくつかの視覚的な正規表現テスターで実験しましたが、* _ non-matching case_ *で、正規表現エンジンがクラスまたはインターフェイス名を含む行を渡すと、次の行で再び検索を開始し、おそらくバックトラックを行うことがわかりますStackOverflowError

質問:

正規表現を変更してStackOverflowErrorを防ぐ方法

  • non-matching case *のように正規表現を変更する方法はありますか(つまり、 「File:Bar.java」を含むヘッダーがファイルBat.javaにコピーされると、インターフェースまたはクラス名を含む行を調べて「\ 1」が最初のグループと一致しないことが確認されると、一致が停止します。

あるいは、それを行うことができる場合、インターフェイスまたはクラスを含む行を調べた後に行われる検索と一致を最小限に抑えて、処理と(できれば)StackOverflowエラーを最小限に抑えることは可能ですか?

  0  0


ベストアンサー

Try

File: (\w+)\.java\n.*^[\w \t]+(?:class|interface) \1

ドット一致全モード。 根拠:

[\ w \ s](|はそこに属していません)は、改行を含むすべてに一致します。 これにより、正規表現の前の部分が一致した行に戻る多くのバックトラックが発生します。

貪欲なドットがファイルの終わりまですべてをむさぼり(クイック)、単語またはスペース/タブで始まる行を見つけるまでバックトラックしますが(改行はありません)、次に class`または interface`と\ 1の場合、スタックスペースはそれほど必要ありません。

別の、おそらくより良い解決策は、問題を部分に分割することです。

最初に `File:(\ w +)\。java`部分に一致します。 次に、 `^ [\ w \ t] +(?: class | interface)`で2回目の検索を行い、同じファイルで最初に検索した `\ 1`に一致するものを検索します。

0


ファローアップ:

上記のTim Pietzcherの提案を差し込むと、彼の貪欲な解決策は実際に速く失敗し、一致するものが見つからなかったときにStackOverflowErrorが発生しませんでした。 ただし、正の場合、StackOverflowErrorは引き続き発生しました。

私はソースコードhttp://checkstyle.svn.sourceforge.net/viewvc/checkstyle/tags/release4_4/checkstyle/src/checkstyle/com/puppycrawl/tools/checkstyle/checks/RegexpCheck.java?revision=を見てみました2298&view = markup [RegexpCheck.java]。 クラスパターンは、式^と$がそれぞれ行末記号または入力シーケンスの終わりの直後または直前に一致するように、複数行モードで構築されます。 次に、クラスファイル全体を文字列に読み取り、パターンを再帰的に検索します(findMatch()を参照)。 それは間違いなくStackOverflowExceptionの原因です。

最終的には機能しませんでした(そしてあきらめました)Maven 2が約6週間前にmaven-checkstyle-plugin-2.4 / Checkstyle 5.0をリリースしてから、ツールをアップグレードすることにしました。 これはStackOverflowErrorの問題を解決しないかもしれませんが、誰かがこれをもう一度追求する必要があると判断するまで、他に何か作業をすることができます。

0


タイトルとURLをコピーしました