3.6% daripada repositori Python yang diuji mempunyai ralat koma yang hilang

Hasil kajian tentang kerentanan kod Python kepada ralat yang berkaitan dengan penggunaan koma yang salah dalam kod telah diterbitkan. Masalahnya disebabkan oleh fakta bahawa apabila menghitung, Python secara automatik menggabungkan rentetan dalam senarai jika ia tidak dipisahkan dengan koma, dan juga menganggap nilai sebagai tuple jika nilai diikuti dengan koma. Selepas menjalankan analisis automatik 666 repositori GitHub dengan kod Python, penyelidik mengenal pasti kemungkinan isu koma dalam 5% daripada projek yang dikaji.

Pemeriksaan manual selanjutnya menunjukkan bahawa ralat sebenar hanya terdapat dalam 24 repositori (3.6%), dan baki 1.4% adalah positif palsu (contohnya, koma boleh sengaja ditinggalkan antara baris untuk menggabungkan laluan fail berbilang baris, cincang panjang, HTML blok atau ungkapan SQL). Perlu diperhatikan bahawa antara 24 repositori dengan ralat sebenar adalah projek besar seperti Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield dan django-helpdesk. Walau bagaimanapun, masalah dengan koma tidak khusus untuk Python dan sering muncul dalam projek C/C++ (contoh pembetulan terkini ialah LLVM, Mono, Tensorflow).

Jenis ralat utama yang dikaji:

  • Tertinggal koma secara tidak sengaja dalam senarai, tupel dan set, menyebabkan rentetan digabungkan dan bukannya ditafsirkan sebagai nilai yang berasingan. Sebagai contoh, dalam Sentry, salah satu ujian terlepas koma di antara rentetan "releases" dan "discover" dalam senarai, yang mengakibatkan penyemakan pengendali "/releasesdiscover" yang tidak wujud, bukannya menyemak "/releases" dan " /discover" secara berasingan.
    3.6% daripada repositori Python yang diuji mempunyai ralat koma yang hilang

    Contoh lain ialah koma yang hilang dalam rapidpro menyebabkan dua peraturan berbeza digabungkan pada baris 572:

    3.6% daripada repositori Python yang diuji mempunyai ralat koma yang hilang

  • Koma hilang pada penghujung takrif tuple elemen tunggal, menyebabkan tugasan menetapkan jenis biasa dan bukannya tupel. Sebagai contoh, ungkapan "nilai = (1,)" akan menghasilkan penetapan kepada pembolehubah tuple satu elemen, tetapi "nilai = (1)" akan menghasilkan penetapan jenis integer. Tanda kurung dalam tugasan ini tidak menjejaskan definisi jenis dan adalah pilihan, dan kehadiran tuple ditentukan oleh penghurai hanya berdasarkan kehadiran koma. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated' # akan diberikan rentetan dan bukannya tuple. ) }
  • Keadaan sebaliknya ialah koma tambahan semasa tugasan. Jika koma tertinggal secara tidak sengaja pada penghujung tugasan, tuple akan ditetapkan sebagai nilai dan bukannya jenis biasa (contohnya, jika "nilai = 1," ditentukan dan bukannya "nilai = 1").

Sumber: opennet.ru

Tambah komen