Question

Je l'ai étudié quelques « renifle » du codage « générique » et « Squiz » normes qui viennent avec Version 1.3 CodeSniffer , et a appris assez pour écrire quelques reniflements « sur mesure » pour attraper quelques codage anti-modèles qui sont spécifiques à un projet PHP que je travaille.

Mais maintenant, mon patron veut utiliser l'outil pour identifier tous les endroits où exec les appels de code (), popen (), passthru (), ou utilise l'opérateur backtick pour exécuter une commande « externe », et je » ai frappé un accroc face aux accents graves.

La classe Generic_Sniffs_PHP_ForbiddenFunctionsSniff qui vient avec la distribution CodeSniffer 1.3 rend essentiellement trivial d'identifier les appels à une « fonction dangereuse » comme exec (), popen () et passthru (), de sorte qu'une partie est facile.

Mais je ne vois aucune référence aux opérateurs de backtick dans le « stock » renifle, et je ne vois aucune mention de l'opérateur backtick dans toute la logique CodeSniffer lui-même - bien que je puisse être à la recherche au mauvais endroit (il m'a fallu un certain temps pour que « -> ». est vraiment T_OBJECT_OPERATOR, par exemple)

Alors ma question est la suivante:

Puis-je utiliser PHP_CodeSniffer pour détecter l'utilisation de l'opérateur backtick dans le code PHP, et si oui, comment?

Était-ce utile?

La solution 2

Cet exemple (avec la plupart des commentaires épiler) travaille avec quelques cas de test simple, - pas CodeSniffer changements requis

class test_Sniffs_Dangerous_BackTickSniff implements 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);
        }
    }
}

}

Comme c'est ce que je cherchais, je vais répondre à ma propre question. Merci Corbin et ircmaxell, pour vos commentaires.

Autres conseils

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

On dirait qu'il n'y a pas de jetons pour les accents graves. Vous devriez cependant être en mesure de suivre la hiérarchie des classes assez de bas vers le bas que vous pouvez trouver un point de connexion où vous pouvez simplement faire strpos ou preg_match la recherche de `. Il faut mentionner dans la documentation CodeSniffer comment faire, ou, comme je l'ai dit, vous pouvez suivre la classe Generic_Sniffs_PHP_ForbiddenFunctionsSniff jusqu'à son parent (et à son parent si nécessaire) jusqu'à ce que vous trouver où la recherche réelle se passe.

Edit: Juste regardé dans le code CodeSniffer, et il semble qu'il pourrait soutenir que la recherche jeton ... Il semble que vous devrez faire un nouveau jeton

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top