Die Ergebnisse einer Untersuchung zur Anfälligkeit von Python-Code für Fehler, die mit der falschen Verwendung von Kommas im Code zusammenhängen, wurden veröffentlicht. Die Probleme entstehen dadurch, dass Python beim Auflisten von Elementen automatisch Strings in einer Liste zusammenführt, wenn diese nicht durch ein Komma getrennt sind. Zudem behandelt es ein Wert als Tupel, wenn diesem ein Komma folgt. Nach einer automatisierten Analyse von 666 GitHub-Repositories mit Python-Code identifizierten die Forscher mögliche Komma-Probleme in 5 % der untersuchten Projekte.
Eine weitere manuelle Überprüfung hat ergeben, dass echte Fehler nur in 24 Repositories (3,6%) vorhanden sind, während die restlichen 1,4% Fehlalarme sind (z. B. könnte ein Komma absichtlich zwischen Zeilen ausgelassen worden sein, um auf mehrere Zeilen verteilte Dateipfade, lange Hashes, HTML-Blöcke oder SQL-Anweisungen zusammenzuführen). Bemerkenswert ist, dass unter den 24 Repositories mit echten Fehlern auch große Projekte wie Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield und django-helpdesk waren. Dabei sind die Probleme mit Kommas nicht spezifisch für Python und treten häufig in Projekten in C/C++ auf (beispielsweise in den jüngsten Korrekturen — LLVM, Mono, Tensorflow).
Hauptarten der untersuchten Fehler:
- Ein versehentlich ausgelassenes Komma in Listen, Tuplen und Mengen, das dazu führt, dass Zeilen zusammengefügt werden, anstatt sie als separate Werte zu interpretieren. So wurde beispielsweise in Sentry in einem der Tests ein Komma zwischen den Einträgen «releases» und «discover» in der Liste ausgelassen, was dazu führte, dass der nicht existierende Handler «/releasesdiscover» überprüft wurde, anstatt die separate Überprüfung von «/releases» und «/discover» durchzuführen.

Ein weiteres Beispiel — ein ausgelassenes Komma in rapidpro führte dazu, dass zwei verschiedene Regeln in Zeile 572 zusammengeführt wurden:

- Ein fehlendes Komma am Ende der Definition eines einseitigen Tupels führt dazu, dass bei der Zuweisung nicht ein Tupel, sondern ein einfacher Typ zugewiesen wird. Zum Beispiel wird der Ausdruck „values = (1,)“ dazu führen, dass der Variable ein einseitiges Tupel zugewiesen wird, während „values = (1)“ zu einer Zuweisung eines ganzzahligen Typs führt. Die Klammern in den genannten Zuweisungen beeinflussen die Typdefinition nicht und sind optional; das Vorhandensein eines Tupels wird vom Parser nur auf der Grundlage von vorhandenen Kommata bestimmt. REST_FRAMEWORK = { ‘DEFAULT_PERMISSION_CLASSES’: ( ‘rest_framework.permissions.IsAuthenticated’ # anstelle eines Tupels wird ein String zugewiesen. ) }
- Das Gegenteil ist der Fall — überflüssige Kommata bei der Zuweisung. Wenn am Ende der Zuweisung versehentlich ein Komma stehen bleibt, wird anstelle eines einfachen Typs ein Tupel zugewiesen (zum Beispiel, wenn anstelle von „value = 1“ „value = 1,“ angegeben wird).
Quelle: opennet.ru


