L'autre jour, Google a publié le code source de l'analyseur robots.txt. Pourquoi ne pas exécuter le projet déjà testé de haut en bas par PVS-Studio et éventuellement trouver une erreur. Aussitôt dit, aussitôt fait. Il est dommage que rien de significatif n'ait pu être trouvé. Eh bien, que ce soit juste une excuse pour féliciter les développeurs de Google.
robots.txt - un fichier d'index qui contient les règles pour les robots de recherche. Il est valide pour les protocoles https, http et ftp. Google a mis son analyseur de fichiers 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 des lecteurs de nos articles savent ce que fait PVS-Studio. Mais si vous êtes nouveau sur notre blog, nous vous donnerons une brève référence. PVS-Studio est un analyseur de code statique qui vous permet de trouver diverses erreurs, vulnérabilités et lacunes 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 des machines utilisateur ou des serveurs de construction, et dans le
cloud . Et l'équipe de PVS-Studio aime écrire des
articles sur la vérification de divers projets. Passons donc aux choses sérieuses et essayons de trouver des erreurs dans le code source de l'analyseur de Google.
À notre grand regret et pour le plus grand plaisir de tous, aucune erreur n'a été trouvée. Seuls quelques défauts mineurs ont été découverts, dont nous parlerons. Vous devez écrire au moins quelque chose :). L'absence d'erreurs s'explique par le faible volume du projet et la haute qualité du code lui-même. Cela ne signifie pas que certaines erreurs ne s'y cachent pas, mais l'analyse statique s'est avérée impuissante pour le moment.
En général, cet article s'est révélé dans l'esprit de notre autre publication, "
L'article le plus court sur la vérification de nginx ".
Il y avait une possibilité de petite optimisation:
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; }
Appeler la fonction
strlen pour savoir si une chaîne n'est pas vide est un moyen inefficace. Une telle vérification peut être rendue beaucoup plus simple:
if (* key [0]! = '\ 0') , et vous n'aurez pas besoin de parcourir tous les éléments de la chaîne 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 de
chemin d'accès est déclarée, mais n'est pas utilisée plus loin. Dans certains cas, les variables inutilisées peuvent indiquer une erreur. Mais ici, il semble qu'auparavant, cette variable ait été utilisée d'une manière ou d'une autre, mais après avoir effectué les modifications, elle n'était plus nécessaire. Ainsi, l'analyseur aide souvent à rendre le code plus propre et à éviter les erreurs en supprimant simplement les conditions préalables à leur apparence.
Dans le cas suivant, l'analyseur, en substance, fait une recommandation pour ajouter un
retour par défaut après que tous les
principaux ont été traités. Il pourrait être utile d'ajouter un
retour à la toute fin pour que vous puissiez comprendre que tout a vraiment fonctionné. Cependant, si ce comportement était prévu et que rien n'avait besoin d'être changé, et je ne voudrais pas voir le message de l'analyseur, alors dans le cas de PVS-Studio, vous pouvez supprimer cet avertissement 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; } }
Il a également été constaté que les deux fonctions ci-dessous, avec des noms différents, ont la même implémentation. C'est peut-être le résultat du fait qu'avant ces fonctions avaient une logique différente, mais arrivaient au même. Ou 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 qui me rend méfiant. Il doit être vérifié par les auteurs du projet.
Ainsi, la vérification de l'analyseur robots.txt de Google a montré que le projet, qui est si activement utilisé et probablement testé à plusieurs reprises pour détecter les erreurs, possède un code de haute qualité. Et les lacunes constatées ne peuvent pas du tout gâcher l'impression de quels codeurs sympas de Google ont été impliqués dans ce projet :).
Nous vous proposons de
télécharger et d'essayer PVS-Studio sur le projet qui vous intéresse.

Si vous souhaitez partager cet article avec un public anglophone, veuillez utiliser le lien vers la traduction: Victoria Khanieva.
PVS-Studio voulait mais n'a pas pu trouver de bugs dans robots.txt