Test edilen Python depolarının %3.6'sında eksik virgül hataları vardı

Python kodunun koddaki virgüllerin yanlış kullanımına bağlı hatalara karşı savunmasızlığı üzerine yapılan çalışmanın sonuçları yayımlandı. Sorunlar, numaralandırma sırasında Python'un virgülle ayrılmamışsa listedeki dizeleri otomatik olarak birleştirmesi ve değerin ardından virgül geliyorsa değeri bir demet olarak değerlendirmesinden kaynaklanmaktadır. Python koduyla 666 GitHub deposunun otomatik analizini yaptıktan sonra araştırmacılar, incelenen projelerin %5'inde olası virgül sorunlarını belirlediler.

Daha ayrıntılı manuel inceleme, gerçek hataların yalnızca 24 depoda (%3.6) mevcut olduğunu ve geri kalan %1.4'ün hatalı pozitifler olduğunu gösterdi (örneğin, çok satırlı dosya yollarını, uzun karmaları, HTML'yi birleştirmek için satırlar arasında kasıtlı olarak virgül çıkarılabilir) bloklar veya SQL ifadeleri). Gerçek hataların olduğu 24 depo arasında Tensorflow, Google V8, Sentry, Pydata xarray, Rapidpro, Django-colorfield ve Django-helpdesk gibi büyük projelerin olması dikkat çekicidir. Ancak virgüllerle ilgili sorunlar Python'a özgü değildir ve sıklıkla C/C++ projelerinde ortaya çıkar (son düzeltmelerin örnekleri LLVM, Mono, Tensorflow'dur).

İncelenen ana hata türleri:

  • Listelerde, kayıtlarda ve kümelerde yanlışlıkla bir virgülün eksik olması, dizelerin ayrı değerler olarak yorumlanmak yerine birleştirilmesine neden olur. Örneğin, Sentry'de testlerden biri, listedeki "releases" ve "discover" dizeleri arasındaki virgülü atladı; bu da "/releases" ve " kontrol etmek yerine var olmayan bir "/releasesdiscover" işleyicisinin kontrol edilmesine yol açtı. /keşfet" ayrı ayrı.
    Test edilen Python depolarının %3.6'sında eksik virgül hataları vardı

    Başka bir örnek ise Rapidpro'da eksik bir virgülün 572. satırda iki farklı kuralın birleştirilmesine neden olmasıdır:

    Test edilen Python depolarının %3.6'sında eksik virgül hataları vardı

  • Tek öğeli bir tanımlama grubu tanımının sonunda eksik bir virgül, atamanın bir tanımlama grubu yerine normal bir tür atamasına neden olur. Örneğin, "değerler = (1,)" ifadesi, bir öğenin tuple değişkenine atamayla sonuçlanacaktır, ancak "değerler = (1)", bir tamsayı türünün atanmasıyla sonuçlanacaktır. Bu atamalardaki parantezler tür tanımını etkilemez ve isteğe bağlıdır ve bir demetin varlığı ayrıştırıcı tarafından yalnızca virgüllerin varlığına göre belirlenir. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated' #, bir tanımlama grubu yerine bir dize atanacaktır. ) }
  • Tam tersi durum ise atama sırasında fazladan virgül kullanılmasıdır. Bir atamanın sonuna yanlışlıkla virgül bırakılırsa, değer olarak normal tür yerine bir tanımlama grubu atanır (örneğin, "değer = 1" yerine "değer = 1" belirtilirse).

Kaynak: opennet.ru

Yorum ekle