L'autre jour, Google a révélé les sources de l'analyseur robots.txt. Pourquoi ne pas essayer le projet déjà bien lointain vérifié en utilisant PVS-Studio et éventuellement trouver un bogue. Ainsi dit donc fait. Mais je souhaite que nous puissions trouver quelque chose de significatif. Eh bien, que ce soit juste une raison de donner des notes complètes aux développeurs Google.
robots.txt - est un fichier d'index qui contient des règles pour les robots de recherche. Il fonctionne pour les protocoles https, http et FTP. Google a mis l'analyseur du fichier robots.txt à la disposition de tous. En savoir plus sur ces nouvelles ici:
Google ouvre le code source de l'analyseur robots.txtJe pense que la plupart de nos lecteurs savent ce que fait PVS-Studio. Mais dans le cas où c'est votre première fois sur notre blog, je vais vous donner une brève référence. PVS-Studio est un analyseur de code statique qui vous permet de trouver une variété de bogues, de vulnérabilités et de failles dans des projets écrits en C, C ++, C # et Java. En d'autres termes, PVS-Studio est une solution
SAST et peut fonctionner à la fois sur les machines des utilisateurs, créer des serveurs et dans le
cloud . L'équipe PVS-Studio aime également rédiger des
articles sur les contrôles de divers projets. Alors, allons droit au but et essayons de trouver des erreurs dans le code source de l'analyseur de Google.
Malheureusement, mais pour le plus grand plaisir de tous, aucune erreur n'a été trouvée. Seulement quelques défauts mineurs, dont je parlerai. Eh bien, je dois écrire quelque chose sur le projet :). L'absence d'erreurs est due à la petite quantité du projet et à la haute qualité du code lui-même. Cela ne signifie pas qu'il n'y a pas d'erreurs cachées, mais l'analyse statique était impuissante à ce moment-là.
Cet article se trouvait donc dans l'esprit d'un autre de notre article "
L'article le plus court sur un chèque de nginx ".
J'ai trouvé un cas avec une optimisation possible:
Performances
réduites du V805 . Il est inefficace d'identifier une chaîne vide en utilisant la construction 'strlen (str)> 0'. Un moyen plus efficace consiste à vérifier: str [0]! = '\ 0'. robots.cc 354
bool RobotsTxtParser::GetKeyAndValueFrom(char **key, ....) { .... *key = line; .... if (strlen(*key) > 0) { .... return true; } return false; }
Il est inefficace d'appeler la fonction
strlen pour savoir si une chaîne est vide. Cette vérification peut être beaucoup plus simple:
if (* key [0]! = '\ 0'). De cette façon, vous n'avez pas à parcourir la chaîne entière, si elle n'est pas vide.
L'objet V808 'path' de type 'basic_string' a été créé mais n'a pas été utilisé. robots.cc 123
std::string GetPathParamsQuery(....) { std::string path; .... }
La chaîne est déclarée, mais n'est plus utilisée. Dans certains cas, les variables inutilisées peuvent indiquer une erreur. Dans ce cas, il semble que cette variable ait été utilisée d'une manière ou d'une autre, mais après avoir apporté des modifications, elle est devenue inutile. Ainsi, l'analyseur aide souvent à rendre le code plus propre et aide à éviter les erreurs en supprimant simplement les prérequis pour leur apparence.
Dans le cas suivant, l'analyseur recommande d'ajouter un
retour par défaut après l'exécution de l'ensemble
principal . Peut-être qu'il vaut la peine d'ajouter une déclaration de
retour à la fin afin de comprendre que tout a vraiment fonctionné. Cependant, si un tel comportement était voulu, rien ne doit être changé. Si vous ne voulez pas voir cet avertissement, dans PVS-Studio, vous pouvez le supprimer et ne plus le revoir :).
V591 La fonction 'main' ne renvoie pas de valeur, ce qui équivaut à 'return 0'. Il est possible que ce comportement soit involontaire. robots_main.cc 99
int main(int argc, char** argv) { .... if (filename == "-h" || filename == "-help" || filename == "--help") { ShowHelp(argc, argv); return 0; } if (argc != 4) { .... return 1; } if (....) { .... return 1; } .... if (....) { std::cout << "...." << std::endl; } }
J'ai également constaté que deux fonctions ci-dessous qui avaient des noms différents ont été implémentées de la même manière. Peut-être est-ce le résultat du fait qu'auparavant ces fonctions avaient une logique différente, mais en sont venues à une. Il se peut qu'une faute de frappe se soit glissée quelque part, ces avertissements doivent donc être soigneusement vérifiés.
V524 Il est étrange que le corps de la fonction 'MatchDisallow' soit entièrement équivalent au corps de la fonction 'MatchAllow'. robots.cc 645
int MatchAllow(absl::string_view path, absl::string_view pattern) { return Matches(path, pattern) ? pattern.length() : -1; } int MatchDisallow(absl::string_view path, absl::string_view pattern) { return Matches(path, pattern) ? pattern.length() : -1; }
C'est le seul endroit dont je me méfie. Il doit être vérifié par les auteurs du projet.
Ainsi, la vérification de l'analyseur robots.txt de Google a montré que ce projet, qui a été vérifié plusieurs fois et est largement utilisé, est de grande qualité. Même certains défauts trouvés ne peuvent pas gâcher l'impression de codeurs Google cool écrivant ce projet :).
Nous vous suggérons également
de télécharger et d'essayer PVS-Studio sur le projet qui vous intéresse.