Die Ergebnisse einer Studie zur AnfĂ€lligkeit von Python-Code fĂŒr Fehler durch inkorrekte Verwendung von Kommas wurden veröffentlicht. Die Probleme entstehen dadurch, dass Python bei AufzĂ€hlungen automatisch Strings in einer Liste zusammenfĂŒhrt, wenn sie nicht durch Kommas getrennt sind, und auch den Wert als Tuple behandelt, wenn auf den Wert ein Komma folgt. Durch die automatisierte Analyse von 666 GitHub-Repositories mit Python-Code identifizierten die Forscher mögliche Komma-Probleme in 5 % der untersuchten Projekte.
Eine anschlieĂende manuelle ĂberprĂŒfung ergab, dass tatsĂ€chliche Fehler nur in 24 Repositories (3,6 %) vorkommen, wĂ€hrend die restlichen 1,4 % Fehlalarme sind (zum Beispiel könnte ein Komma absichtlich zwischen Strings weggelassen worden sein, um gebrochene Datei-Pfade, lange Hashes, HTML-Blöcke oder SQL-AusdrĂŒcke zusammenzufĂŒhren). Interessanterweise gehören zu den 24 Repositories mit tatsĂ€chlichen Fehlern gröĂere Projekte wie Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield und django-helpdesk. Dabei sind die Komma-Probleme nicht spezifisch fĂŒr Python und tauchen hĂ€ufig in C/C++-Projekten auf (beispielsweise kĂŒrzliche Korrekturen â LLVM, Mono, Tensorflow).
Hauptarten der untersuchten Fehler:
- Ein versehentlich fehlendes Komma in Listen, Tuples und Mengen, das dazu fĂŒhrt, dass Strings zusammengefĂŒhrt werden, anstatt sie als separate Werte zu interpretieren. Zum Beispiel wurde in Sentry in einem der Tests ein Komma zwischen den Strings âreleasesâ und âdiscoverâ in einer Liste ĂŒbersehen, was dazu fĂŒhrte, dass der nicht existierende Handler â/releasesdiscoverâ ĂŒberprĂŒft wurde, anstatt getrennt â/releasesâ und â/discoverâ zu ĂŒberprĂŒfen.

Ein weiteres Beispiel â das fehlende Komma in rapidpro fĂŒhrte dazu, dass zwei verschiedene Regel in Zeile 572 zusammengefĂŒhrt wurden:

- Ein fehlendes Komma am Ende der Definition eines Ein-Elemente-Tupels, das dazu fĂŒhrt, dass bei der Zuweisung nicht ein Tuple, sondern ein gewöhnlicher Typ zugewiesen wird. Zum Beispiel fĂŒhrt der Ausdruck âvalues = (1,)â zur Zuweisung einer Variable mit einem Ein-Elemente-Tuple, wĂ€hrend âvalues = (1)â zur Zuweisung eines Ganzzahltyps fĂŒhrt. Die Klammern in den angegebenen Zuweisungen beeinflussen nicht die Typdefinition und sind optional, wĂ€hrend das Vorhandensein eines Tuples nur anhand der Kommas vom Parser erkannt wird. REST_FRAMEWORK = { âDEFAULT_PERMISSION_CLASSESâ: ( ârest_framework.permissions.IsAuthenticatedâ # anstelle eines Tuples wird ein String zugewiesen. ) }
- Die gegenteilige Situation â ĂŒberflĂŒssige Kommas bei der Zuweisung. Wenn am Ende einer Zuweisung versehentlich ein Komma zurĂŒckgelassen wird, wird anstelle eines normalen Typs ein Tuple zugewiesen (zum Beispiel, wenn anstelle von âvalue = 1â âvalue = 1,â angegeben wird).
Quelle: opennet.ru


