3.6% kho Python được kiểm tra có lỗi thiếu dấu phẩy

Kết quả nghiên cứu về lỗ hổng của mã Python đối với các lỗi liên quan đến việc sử dụng sai dấu phẩy trong mã đã được công bố. Vấn đề xảy ra là do khi liệt kê, Python sẽ tự động nối các chuỗi trong danh sách nếu chúng không được phân tách bằng dấu phẩy và cũng coi giá trị là một bộ dữ liệu nếu giá trị được theo sau bởi dấu phẩy. Sau khi tiến hành phân tích tự động 666 kho GitHub bằng mã Python, các nhà nghiên cứu đã xác định được các vấn đề về dấu phẩy có thể xảy ra ở 5% dự án được nghiên cứu.

Kiểm tra thủ công sâu hơn cho thấy rằng các lỗi thực sự chỉ xuất hiện trong 24 kho lưu trữ (3.6%) và 1.4% còn lại là dương tính giả (ví dụ: dấu phẩy có thể được cố tình bỏ qua giữa các dòng để nối các đường dẫn tệp nhiều dòng, hàm băm dài, HTML khối hoặc biểu thức SQL). Đáng chú ý là trong số 24 kho lưu trữ có lỗi thực sự có các dự án lớn như Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield và django-helpdesk. Tuy nhiên, các vấn đề về dấu phẩy không xảy ra riêng với Python và thường xuất hiện trong các dự án C/C++ (ví dụ về các bản sửa lỗi gần đây là LLVM, Mono, Tensorflow).

Các loại lỗi chính được nghiên cứu:

  • Vô tình thiếu dấu phẩy trong danh sách, bộ dữ liệu và bộ, khiến các chuỗi bị nối thay vì được hiểu là các giá trị riêng biệt. Ví dụ: trong Sentry, một trong các thử nghiệm đã bỏ sót dấu phẩy giữa chuỗi "releases" và "discover" trong danh sách, dẫn đến việc kiểm tra trình xử lý "/releasesdiscover" không tồn tại, thay vì kiểm tra "/releases" và " /khám phá" riêng biệt.
    3.6% kho Python được kiểm tra có lỗi thiếu dấu phẩy

    Một ví dụ khác là thiếu dấu phẩy trong rapidpro khiến hai quy tắc khác nhau được hợp nhất trên dòng 572:

    3.6% kho Python được kiểm tra có lỗi thiếu dấu phẩy

  • Thiếu dấu phẩy ở cuối định nghĩa bộ dữ liệu một phần tử, khiến phép gán chỉ định một loại thông thường chứ không phải một bộ dữ liệu. Ví dụ: biểu thức "values ​​​​= (1,)" sẽ dẫn đến việc gán cho một biến của một bộ gồm một phần tử, nhưng "values ​​​​= (1)" sẽ dẫn đến việc gán một kiểu số nguyên. Dấu ngoặc đơn trong các phép gán này không ảnh hưởng đến định nghĩa kiểu và là tùy chọn, đồng thời sự hiện diện của một bộ dữ liệu được xác định bởi trình phân tích cú pháp chỉ dựa trên sự hiện diện của dấu phẩy. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated' # sẽ được gán một chuỗi thay vì một bộ dữ liệu. ) }
  • Tình huống ngược lại là có thêm dấu phẩy khi làm bài. Nếu vô tình để lại dấu phẩy ở cuối phép gán, một bộ dữ liệu sẽ được gán làm giá trị thay vì loại thông thường (ví dụ: nếu “value = 1” được chỉ định thay vì “value = 1”).

Nguồn: opennet.ru

Thêm một lời nhận xét