1

CodeSnifferバージョン1.3に付属する「Generic」および「Squiz」コーディング標準からいくつかの「スニフ」を研究し、PHPに固有のコーディングアンチパターンをキャッチするためのいくつかの「カスタム」スニフを作成するのに十分なことを学びました。私が取り組んでいるプロジェクト。

しかし今、上司は、コードがexec()、popen()、passthru()を呼び出すすべての場所を識別するためにツールを使用するか、バッククォート演算子を使用して「外部」コマンドを実行することを望んでいます。バッククォートを処理するスナッグ。

CodeSniffer 1.3ディストリビューションに付属するGeneric_Sniffs_PHP_ForbiddenFunctionsSniffクラスを使用すると、exec()、popen()、passthru()などの「危険な関数」への呼び出しを簡単に識別できるため、その部分は簡単です。

しかし、「ストック」スニフでバッククォート演算子への参照を確認することはできません。また、CodeSnifferロジック自体でバッククォート演算子についての言及も表示されません。ただし、間違った場所を探している可能性があります(たとえば、「->」は実際にはT_OBJECT_OPERATORであることがわかります)。

だから私の質問はこれです:

PHP_CodeSnifferを使用して、PHPコードでのバッククォート演算子の使用を検出できますか?その場合、どのように使用しますか?

4

2 に答える 2

2

http://php.net/manual/en/tokens.php

バックティックのトークンがないようです。ただし、`を探してstrposまたはpreg_matchを実行できる接続ポイントを見つけることができるように、クラス階層を十分に低く追跡できる必要があります。CodeSnifferのドキュメントにその方法を記載する必要があります。または、私が言ったように、実際の検索が行われている場所が見つかるまで、Generic_Sniffs_PHP_ForbiddenFunctionsSniffクラスをその親(および必要に応じてその親)までたどることができます。

編集:CodeSnifferコードを調べたところ、トークン検索のみがサポートされているようです...したがって、新しいトークンを作成する必要があるようです。

于 2011-09-06T23:29:55.783 に答える
1

この例(ほとんどのコメントが削除されています)は、いくつかの単純なテストケースで機能します-CodeSnifferの変更は必要ありません!

クラスtest_Sniffs_Dangerous_BackTickSniffはPHP_CodeSniffer_Sniffを実装します{

public $supportedTokenizers = array('PHP');

public function register() {
    return array(T_NONE);
}

public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) {
    // generate one error for every pair of backticks:
    static $reported = array();

    $all_tokens = $phpcsFile->getTokens();

    if ($all_tokens[$stackPtr]['content'] == '`') {
        $lno = $all_tokens[$stackPtr]['line'];
        if (!isset($reported[$lno])) {
            $reported[$lno] = true;
            $phpcsFile->addError('Avoid backticks', $stackPtr);
        }
    }
}

}

これが私が求めていたものなので、私は自分の質問に答えるつもりです。コメントをありがとう、Corbinとircmaxellに感謝します。

于 2011-09-07T02:11:17.640 に答える