PVS-Studio wollte, konnte aber keine Fehler in robots.txt finden

Bild 1

Neulich hat Google den Quellcode für den Parser robots.txt veröffentlicht. Führen Sie das bereits von PVS-Studio getestete Projekt aus und finden Sie möglicherweise einen Fehler. Kaum gesagt als getan. Schade, dass nichts Bedeutendes gefunden werden konnte. Dann ist es nur eine Ausrede, Google-Entwickler zu loben.

robots.txt - Eine Indexdatei, die die Regeln für Suchroboter enthält. Es gilt für die Protokolle https, http und ftp. Google hat seinen Datei-Parser robots.txt für alle verfügbar gemacht. Lesen Sie hier mehr über diese Neuigkeiten: Google öffnet den Quellcode des Pars robots.txt

Ich denke, dass die meisten Leser unserer Artikel wissen, was PVS-Studio macht. Falls Sie neu in unserem Blog sind, geben wir eine kurze Referenz. PVS-Studio ist ein statischer Code-Analysator, mit dem Sie eine Vielzahl von Fehlern, Schwachstellen und Mängeln in Projekten finden können, die in C, C ++, C # und Java geschrieben wurden. Mit anderen Worten, PVS-Studio ist eine SAST- Lösung und kann sowohl auf Benutzercomputern oder Build-Servern als auch in der Cloud verwendet werden . Das PVS-Studio-Team schreibt gerne Artikel über die Überprüfung verschiedener Projekte. Kommen wir also zur Sache und versuchen, Fehler im Parser-Quellcode von Google zu finden.

Zu unserem Bedauern und zur Freude aller anderen wurden keine Fehler gefunden. Es wurden nur ein paar kleinere Mängel gefunden, über die wir sprechen werden. Du musst wenigstens etwas schreiben :). Das Fehlen von Fehlern erklärt sich aus dem geringen Projektvolumen und der hohen Qualität des Codes. Dies bedeutet nicht, dass sich einige Fehler dort nicht verbergen, aber die statische Analyse erwies sich im Moment als machtlos.

Im Allgemeinen stellte sich dieser Artikel im Geiste unserer anderen Veröffentlichung heraus: " Der kürzeste Artikel zur Nginx-Verifizierung ."

Es bestand die Möglichkeit einer kleinen Optimierung:

V805 Leistungsminderung. Es ist ineffizient, eine leere Zeichenfolge mithilfe des Konstrukts 'strlen (str)> 0' zu identifizieren. Eine effizientere Möglichkeit besteht darin, Folgendes zu überprüfen: str [0]! = '\ 0'. robots.cc 354

bool RobotsTxtParser::GetKeyAndValueFrom(char **key, ....) { .... *key = line; .... if (strlen(*key) > 0) { .... return true; } return false; } 

Das Aufrufen der Funktion strlen , um herauszufinden, ob eine Zeichenfolge nicht leer ist, ist ineffizient. Eine solche Überprüfung kann viel einfacher gemacht werden: if (* key [0]! = '\ 0') , und Sie müssen nicht alle Elemente der Zeichenfolge durchgehen, wenn sie nicht leer ist.

Das V808 -Objekt 'path' vom Typ 'basic_string' wurde erstellt, aber nicht verwendet. robots.cc 123

 std::string GetPathParamsQuery(....) { std::string path; .... } 

Die Pfadzeichenfolge wird deklariert, aber nicht weiter verwendet. In einigen Fällen können nicht verwendete Variablen auf einen Fehler hinweisen. Aber hier scheint es, dass diese Variable früher irgendwie verwendet wurde, aber nach den Änderungen wurde sie nicht mehr benötigt. Daher hilft der Analysator häufig auch dabei, den Code sauberer zu gestalten und Fehler zu vermeiden, indem einfach die Voraussetzungen für ihr Erscheinungsbild entfernt werden.

Im folgenden Fall empfiehlt der Analysator im Wesentlichen, eine Standardrückgabe hinzuzufügen, nachdem alle Hauptdaten verarbeitet wurden. Es könnte sich lohnen, ganz am Ende eine Rendite hinzuzufügen, damit Sie verstehen, dass alles wirklich funktioniert hat. Wenn dieses Verhalten jedoch geplant war und nichts geändert werden musste und ich die Analysatormeldung nicht sehen möchte, können Sie diese Warnung im Fall von PVS-Studio unterdrücken und nie wieder sehen :).

V591 Die Funktion 'main' gibt keinen Wert zurück, der 'return 0' entspricht. Es ist möglich, dass dies ein unbeabsichtigtes Verhalten ist. 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; } } 

Es wurde auch festgestellt, dass die beiden folgenden Funktionen mit unterschiedlichen Namen dieselbe Implementierung haben. Vielleicht ist dies das Ergebnis der Tatsache, dass diese Funktionen zuvor unterschiedliche Logik hatten, aber zu derselben kamen. Oder es kann sein, dass sich irgendwo ein Tippfehler eingeschlichen hat, weshalb solche Warnungen sorgfältig geprüft werden sollten.

V524 Es ist seltsam, dass der Hauptteil der Funktion 'MatchDisallow' dem Hauptteil der Funktion 'MatchAllow' vollständig entspricht. 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; } 

Dies ist der einzige Ort, der mich misstrauisch macht. Es sollte von den Autoren des Projekts überprüft werden.

Die Überprüfung des Robser.txt-Parsers von Google ergab daher, dass das Projekt, das so aktiv verwendet und höchstwahrscheinlich wiederholt auf Fehler getestet wird, einen qualitativ hochwertigen Code aufweist. Und die festgestellten Mängel können den Eindruck nicht zerstören, welche coolen Codierer von Google an diesem Projekt beteiligt waren :).

Wir bieten Ihnen an , PVS-Studio für das Projekt herunterzuladen und zu testen, an dem Sie interessiert sind.



Wenn Sie diesen Artikel einem englischsprachigen Publikum zugänglich machen möchten, verwenden Sie bitte den Link zur Übersetzung: Victoria Khanieva. PVS-Studio wollte, konnte aber keine Fehler in robots.txt finden

Source: https://habr.com/ru/post/de459662/


All Articles