Liefern Sie sauberen und sicheren Code für Ihre Python-Anwendungen
Einleitung
Entwickler tragen heute eine große Verantwortung – sie lösen nicht nur einige der größten Herausforderungen der Branche, sondern es wird auch erwartet, dass sie diese Lösungen von Anfang an mit den höchsten Standards für Codequalität und -sicherheit liefern.
Die hier hervorgehobene Erfolgsgeschichte zeigt, warum statische Code-Analyse-Tools für diese Bemühungen zur Verbesserung der Codequalität und Codesicherheit unerlässlich sind und wie sie der Python-Community geholfen haben, Fehler und Schwachstellen in einigen prominenten Open-Source-Python-Projekten zu identifizieren (und zu beheben).
Wachsende technische Schulden und Sicherheitsbedenken
Mit dem rasanten Wachstum von Python-Anwendungen, die neue und innovative Anwendungsfälle abdecken, stehen Entwicklungsteams unter ständigem Druck, Fristen einzuhalten und Projekte pünktlich abzuliefern – oft auf Kosten der Zuverlässigkeit, Wartbarkeit und Sicherheit des Codes. Dies führt nicht nur zu langfristigen technischen Schulden, sondern kann auch erhebliche Sicherheitslücken in den Codebasen hinterlassen.
Mit dem gemeinsamen Ziel, Probleme früher im Entwicklungsprozess zu erkennen (Shift-Left-Ansatz), sind Teams oft an neuen und fortschrittlichen Tools interessiert, um zu sehen, ob sie gut in ihren Workflow passen, intuitiv genug sind und ihnen helfen, dieses Ziel zu erreichen. Glücklicherweise gibt es viele Tools und Workflows, die Python-Benutzer unterstützen können. Tatsächlich ist das Python-Ökosystem mit Linting- und statischen Analyse-Tools (z. B. PyLint, Flake8, Bandit, PyT, PySa etc., um nur einige zu nennen) angereichert, und die meisten Python-Entwickler verwenden bereits eines oder mehrere davon.
Bei SonarSource sind wir mit den Bedürfnissen (und Problemen) der Entwickler-Community bestens vertraut. Tatsächlich glauben wir, dass nur Entwickler einen nachhaltigen Einfluss auf Codequalität und Codesicherheit haben können. Deshalb entwickeln wir Open-Source- und kommerzielle Code-Analysatoren – SonarLint, SonarCloud, SonarQube – mit dem Ziel, Teams zu befähigen, Codierungsprobleme in ihren bestehenden Workflows zu lösen. In dieser Mission tragen wir ebenfalls eine große Verantwortung, was bedeutet, präzises und umsetzbares Feedback zu liefern und Probleme mit hoher Präzision zu finden (d. h. Fehlalarme zu minimieren).
Im nächsten Abschnitt werden wir darüber sprechen, wie die Analyse beliebter Open-Source-Python-Projekte nicht nur eine Gelegenheit ist, den Mitwirkenden großartiges Feedback zu geben, sondern auch dazu beiträgt, die Qualität und Präzision von statischen Code-Analyse-Tools kontinuierlich zu verbessern – ein gemeinschaftlich getragener Kreis.
Fehler und Schwachstellen, die in beliebten Python-Projekten entdeckt wurden
Wir haben einige Open-Source-Projekte – tensorflow, numpy, salt, sentry und biopython – mit SonarCloud analysiert, um offensichtliche Lücken zu identifizieren. Wir wissen, dass diese hochkarätigen Open-Source-Projekte oft von Tausenden von Projekten genutzt werden und ihre Entwicklungsworkflows alle Best Practices beinhalten – Code-Reviews, Testabdeckung, Nutzung von mehr als einem Tool (flake8, pylint, Bandit …). Wir haben die Projekte mit SonarCloud analysiert und die Ergebnisse waren sehr interessant. Selbstverständlich wurden die Probleme von den Projekten umgehend anerkannt und behoben.
"Einige der Dinge, die [SonarCloud] findet, sind beeindruckend (wahrscheinlich durch Introspektion und/oder Typinferenz angetrieben), nicht nur die einfache Mustererkennung, an die ich aus dem Großteil des Flake8-Ökosystems gewöhnt bin."
--- Peter J. A. Cock - Maintainer von BioPython (ursprünglicher Beitrag hier)
Hervorgehoben werden im Folgenden einige Beispiele von analysierten Projekten und Probleme, die von anderen Tools übersehen, aber von SonarCloud erkannt wurden. Während Sie dies lesen, könnte es interessant sein, nicht nur über die Leistungsfähigkeit der Tools nachzudenken, sondern auch dies als Lernmöglichkeit zu betrachten, um ähnliche Fallstricke in Zukunft proaktiv zu vermeiden.
Typfehler
Das folgende Beispiel zeigt das Problem, das bei Tensorflow gefunden wurde – eine Open-Source-Plattform für maschinelles Lernen, die von Google entwickelt wurde.
SonarCloud verfügt über eine Typinferenz-Engine, die es ihm ermöglicht, erweiterte Typfehler zu erkennen. Es nutzt jede verfügbare Information, um den Variablentyp abzuleiten, einschließlich Typeshed Stubs, Zuweisungen und Ihrer Typannotationen. Gleichzeitig meckert es nicht, wenn Sie keine Typannotationen verwenden, und ist darauf ausgelegt, Fehlalarme zu vermeiden.
Hier ermöglicht die Kontrollflussanalyse, dass sie versteht, dass state_shape ein Tupel ist, weil ihm output_shape[1:] zugewiesen wird, wenn output_shape ein tuple ist. Der Algorithmus kann spätere list-Zuweisungen zu output_shape ignorieren.

Unerreichbarer Code
Das folgende Beispiel zeigt das Problem, das bei Sentry gefunden wurde – eine Python-Bibliothek zur Überwachung von Performance- und Fehlerengpässen.
Das Erkennen von totem Code ist einfach, wenn er sich direkt nach einer return- oder raise-Anweisung befindet. Etwas schwieriger ist es, wenn das return bedingt ist. SonarCloud verwendet einen Kontrollflussgraphen, um Fälle zu erkennen, in denen mehrere Zweige enden, bevor eine Anweisung erreicht wird.

Falsche Felder in formatierten Strings
Das folgende Beispiel zeigt das Problem, das beim Salt Project gefunden wurde – ein Python-Paket für ereignisgesteuerte Automatisierung, Remote-Aufgabenausführung und Konfigurationsmanagement.
Es ist ziemlich üblich, falsche Feldnamen oder Indizes bei der String-Formatierung zu referenzieren. Pylint und Flake8 haben Regeln, die dieses Problem mit String-Literalen erkennen, aber sie übersehen Fehler, wenn der Format-String in einer Variablen gespeichert ist.

Nicht ausgelöste Ausnahmen
Das folgende Beispiel zeigt das Problem, das bei Biopython gefunden wurde – ein Werkzeug für biologische Berechnungen und Informatik.
Wenn wir Code überprüfen, schauen wir uns normalerweise Klassen, Variablen und andere aussagekräftige Symbole an und vergessen oft, kleine Details zu überprüfen, wie z. B. "steht ein raise-Schlüsselwort vor meiner Ausnahme". SonarCloud analysiert das gesamte Projekt, um Typenhierarchien zu extrahieren. Es erkennt, wenn benutzerdefinierte Ausnahmen verworfen werden, nicht nur die integrierten.

Vergleiche, die keinen Sinn ergeben
Das folgende Beispiel zeigt das Problem, das bei Numpy gefunden wurde – eine numerische Berechnungsbibliothek für große mehrdimensionale Arrays und Matrizen. SonarCloud hat viele Regeln, die unsinnigen Code erkennen. Der Vergleich inkompatibler Typen mit == wird niemals fehlschlagen, aber er wird immer False zurückgeben, oder True, wenn Sie != verwenden. Hier sehen wir ein Problem, weil platform.architecture() ein Tupel zurückgibt.

Dies sind nur einige Beispiele, und Sie finden alle von den Projektverantwortlichen erkannten und behobenen Probleme in den einzelnen GitHub-Projekten – tensorflow, numpy, salt, sentry und biopython.
Die richtige Anleitung am richtigen Ort und zur richtigen Zeit
Das Erstellen und Warten großartiger Software erfordert viele Teams, die mehrere Tools verwenden, und es ist wichtig, Teams mit Werkzeugen auszustatten, die zur richtigen Zeit und am richtigen Ort die richtige Anleitung bieten.
SonarLint, SonarQube und SonarCloud können Python-Entwickler bei ihrer Arbeit unterstützen, indem sie
- Automatisierte Code-Analyse beginnen von der IDE über Code-Review-Workflows bis hin zu Deployment-Pipelines.
- Erkennung einer breiten Palette von Problemen bei der Codequalität und Codesicherheit frühzeitig im Entwicklungszyklus.
- Teams helfen, 'Clean as you Code' zu praktizieren, damit neuer Code mit den höchsten Qualitäts- und Sicherheitsstandards geliefert wird und dadurch langfristige technische Schulden reduziert werden.
Um Probleme schnell zu erkennen, während Sie Code in Ihrer IDE schreiben, ist SonarLint (Open Source und völlig kostenlos) über den IDE-Marktplatz Ihrer Wahl erhältlich: www.sonarlint.org/
SonarQube und SonarCloud sind On-Premise- bzw. Cloud-Lösungen, die Projekten helfen, Fehler, Schwachstellen, Code Smells und Security Hotspots in ihren Code-Repository-Plattformen (wie GitLab, GitHub, Azure DevOps oder Bitbucket) zu erkennen, sodass Teams nur qualitativ hochwertigen und sicheren Code mergen können. Sie sind für alle Open-Source-Projekte völlig kostenlos. Sie können sie unter www.sonarqube.com oder www.sonarcloud.com ausprobieren.
Wenn Sie neugierig sind, welche Fehler oder Schwachstellen sich in Ihrem Python-Code-Repository verbergen könnten, analysieren Sie Ihr Projekt einfach, so wie wir es in diesen Beispielen getan haben. Es ist eine großartige Gelegenheit, Ihre Entwicklungspipeline zu stärken und Probleme früher zu erkennen. Dabei stellen Sie vielleicht auch fest, dass es eine schöne Lernmöglichkeit ist und Sie bewährte Praktiken und/oder gefährliche Muster entdecken, derer Sie sich möglicherweise nicht bewusst sind.
