3.6% repositori Python yang diuji tidak memiliki kesalahan koma

Hasil studi tentang kerentanan kode Python terhadap kesalahan terkait penggunaan koma yang salah dalam kode telah dipublikasikan. Masalah ini disebabkan oleh fakta bahwa ketika melakukan enumerasi, Python secara otomatis menggabungkan string dalam daftar jika tidak dipisahkan dengan koma, dan juga memperlakukan nilai sebagai tupel jika nilainya diikuti dengan koma. Setelah melakukan analisis otomatis terhadap 666 repositori GitHub dengan kode Python, para peneliti mengidentifikasi kemungkinan masalah koma di 5% proyek yang diteliti.

Pemeriksaan manual lebih lanjut menunjukkan bahwa kesalahan nyata hanya terjadi di 24 repositori (3.6%), dan 1.4% sisanya adalah positif palsu (misalnya, koma dapat dengan sengaja dihilangkan di antara baris untuk menggabungkan jalur file multi-baris, hash panjang, HTML blok atau ekspresi SQL). Patut dicatat bahwa di antara 24 repositori dengan kesalahan nyata terdapat proyek besar seperti Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, Django-colorfield dan Django-helpdesk. Namun, masalah dengan koma tidak spesifik untuk Python dan sering muncul di proyek C/C++ (contoh perbaikan terbaru adalah LLVM, Mono, Tensorflow).

Jenis kesalahan utama yang dipelajari:

  • Secara tidak sengaja kehilangan koma dalam daftar, tupel, dan set, menyebabkan string digabungkan dan bukannya ditafsirkan sebagai nilai terpisah. Misalnya, di Sentry, salah satu pengujian melewatkan koma di antara string "releases" dan "discover" dalam daftar, yang mengakibatkan pengecekan handler "/releasesdiscover" yang tidak ada, alih-alih mencentang "/releases" dan " /temukan" secara terpisah.
    3.6% repositori Python yang diuji tidak memiliki kesalahan koma

    Contoh lainnya adalah hilangnya koma di rapidpro menyebabkan dua aturan berbeda digabungkan pada baris 572:

    3.6% repositori Python yang diuji tidak memiliki kesalahan koma

  • Hilangnya koma di akhir definisi tupel elemen tunggal, menyebabkan penugasan menetapkan tipe reguler, bukan tupel. Misalnya, ekspresi "nilai = (1,)" akan menghasilkan penugasan ke variabel tupel satu elemen, tetapi "nilai = (1)" akan menghasilkan penugasan tipe integer. Tanda kurung dalam penugasan ini tidak mempengaruhi definisi tipe dan bersifat opsional, dan keberadaan tupel ditentukan oleh parser hanya berdasarkan adanya koma. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated' # akan diberi string, bukan tuple. ) }
  • Situasi sebaliknya adalah koma ekstra selama penugasan. Jika koma secara tidak sengaja tertinggal di akhir tugas, tupel akan ditetapkan sebagai nilai, bukan tipe biasa (misalnya, jika β€œnilai = 1”, yang ditentukan, bukan β€œnilai = 1”).

Sumber: opennet.ru

Tambah komentar