نتایج یک مطالعه در مورد آسیب پذیری کد پایتون در برابر خطاهای مربوط به استفاده نادرست از کاما در کد منتشر شده است. مشکلات ناشی از این واقعیت است که پایتون هنگام شمارش، رشتههای موجود در لیست را در صورتی که با کاما از هم جدا نشوند، بهطور خودکار به هم متصل میکند، و همچنین در صورتی که مقدار با کاما به دنبال آن باشد، مقدار را به عنوان یک تاپل در نظر میگیرد. پس از انجام تجزیه و تحلیل خودکار 666 مخزن GitHub با کد پایتون، محققان مشکلات احتمالی کاما را در 5 درصد از پروژه های مورد مطالعه شناسایی کردند.
بازرسی دستی بیشتر نشان داد که خطاهای واقعی تنها در 24 مخزن (3.6٪) وجود دارد، و 1.4٪ باقی مانده مثبت کاذب بود (به عنوان مثال، یک کاما را می توان عمداً بین خطوط حذف کرد تا مسیرهای فایل چند خطی، هش های طولانی، HTML را به هم متصل کند. بلوک ها یا عبارات SQL). قابل توجه است که در میان 24 مخزن با خطاهای واقعی، پروژه های بزرگی مانند Tensorflow، Google V8، Sentry، Pydata xarray، rapidpro، django-colorfield و django-helpdesk وجود داشت. با این حال، مشکلات کاما مخصوص پایتون نیستند و اغلب در پروژههای C/C++ ظاهر میشوند (نمونههایی از اصلاحات اخیر LLVM، Mono، Tensorflow هستند).
انواع اصلی خطاهای مورد مطالعه:
- از دست دادن تصادفی کاما در لیست ها، تاپل ها و مجموعه ها، باعث می شود رشته ها به جای تفسیر به عنوان مقادیر جداگانه به هم متصل شوند. به عنوان مثال، در Sentry، یکی از تستها کاما بین رشتههای "releases" و "discover" در لیست را از دست داد، که منجر به بررسی یک کنترلکننده غیروجود "/releasesdiscover" به جای بررسی "/releases" و " شد. /کشف" به طور جداگانه.
مثال دیگر این است که یک کامای از دست رفته در rapidpro باعث شد دو قانون مختلف در خط 572 ادغام شوند:
- یک کامای از دست رفته در انتهای یک تعریف تاپل تک عنصری، که باعث میشود تخصیص به جای تاپل، یک نوع معمولی اختصاص دهد. به عنوان مثال، عبارت "values = (1,)" منجر به انتساب به متغیری از یک عنصر چندگانه می شود، اما "values = (1)" منجر به انتساب یک نوع عدد صحیح می شود. پرانتز در این انتساب ها بر تعریف نوع تأثیر نمی گذارد و اختیاری است و وجود یک تاپل توسط تجزیه کننده تنها بر اساس وجود کاما تعیین می شود. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated' # به جای یک تاپل، یک رشته اختصاص داده می شود. ) }
- وضعیت مخالف، کاماهای اضافی در هنگام انتساب است. اگر یک کاما به طور تصادفی در پایان یک انتساب گذاشته شود، به جای نوع معمول، یک تاپل به عنوان مقدار اختصاص داده می شود (به عنوان مثال، اگر "مقدار = 1" به جای "مقدار = 1" مشخص شود).
منبع: opennet.ru