3.6% ของที่เก็บ Python ที่ทดสอบไม่มีข้อผิดพลาดลูกน้ำ

ผลการศึกษาช่องโหว่ของโค้ด Python ต่อข้อผิดพลาดที่เกี่ยวข้องกับการใช้เครื่องหมายจุลภาคในโค้ดไม่ถูกต้องได้รับการเผยแพร่แล้ว ปัญหามีสาเหตุมาจากข้อเท็จจริงที่ว่าเมื่อทำการแจกแจง Python จะเชื่อมสตริงในรายการโดยอัตโนมัติหากไม่ได้คั่นด้วยเครื่องหมายจุลภาค และยังถือว่าค่าเป็นสิ่งทูเปิลหากค่านั้นตามหลังด้วยเครื่องหมายจุลภาค หลังจากดำเนินการวิเคราะห์อัตโนมัติของที่เก็บ 666 GitHub ด้วยโค้ด Python แล้ว นักวิจัยได้ระบุปัญหาเครื่องหมายจุลภาคที่เป็นไปได้ใน 5% ของโปรเจ็กต์ที่ศึกษา

การตรวจสอบด้วยตนเองเพิ่มเติมแสดงให้เห็นว่ามีข้อผิดพลาดจริงอยู่ในที่เก็บเพียง 24 แห่ง (3.6%) และส่วนที่เหลืออีก 1.4% เป็นผลบวกลวง (เช่น อาจจงใจละเครื่องหมายจุลภาคระหว่างบรรทัดเพื่อเชื่อมเส้นทางไฟล์หลายบรรทัด แฮชแบบยาว และ HTML บล็อกหรือนิพจน์ SQL) เป็นที่น่าสังเกตว่าในบรรดาที่เก็บ 24 แห่งที่มีข้อผิดพลาดจริงนั้นเป็นโปรเจ็กต์ขนาดใหญ่เช่น Tensorflow, Google V8, Sentry, Pydata xarray, Rapidpro, django-colorfield และ django-helpdesk อย่างไรก็ตาม ปัญหาเกี่ยวกับเครื่องหมายจุลภาคไม่ได้เฉพาะเจาะจงกับ Python และมักจะเกิดขึ้นในโปรเจ็กต์ C/C++ (ตัวอย่างของการแก้ไขล่าสุด ได้แก่ LLVM, Mono, Tensorflow)

ข้อผิดพลาดประเภทหลักที่ศึกษา:

  • บังเอิญไม่มีเครื่องหมายจุลภาคในรายการ สิ่งอันดับ และชุด ส่งผลให้สตริงถูกต่อเข้าด้วยกันแทนที่จะตีความว่าเป็นค่าที่แยกจากกัน ตัวอย่างเช่น ใน Sentry หนึ่งในการทดสอบพลาดเครื่องหมายจุลภาคระหว่างสตริง "releases" และ "discover" ในรายการ ซึ่งส่งผลให้มีการตรวจสอบตัวจัดการ "/releasesdiscover" ที่ไม่มีอยู่จริง แทนที่จะตรวจสอบ "/releases" และ " /ค้นพบ" แยกกัน
    3.6% ของที่เก็บ Python ที่ทดสอบไม่มีข้อผิดพลาดลูกน้ำ

    อีกตัวอย่างหนึ่งคือ การที่เครื่องหมายจุลภาคหายไปใน Rapidpro ทำให้กฎสองข้อที่แตกต่างกันถูกรวมเข้าด้วยกันในบรรทัด 572:

    3.6% ของที่เก็บ Python ที่ทดสอบไม่มีข้อผิดพลาดลูกน้ำ

  • เครื่องหมายจุลภาคหายไปที่ส่วนท้ายของคำจำกัดความของทูเปิลองค์ประกอบเดียว ทำให้การมอบหมายงานต้องกำหนดประเภทปกติแทนที่จะเป็นทูเพิล ตัวอย่างเช่น นิพจน์ "values ​​​​= (1,)" จะส่งผลให้เกิดการกำหนดให้กับตัวแปรของทูเพิลขององค์ประกอบหนึ่ง แต่ "values ​​​​= (1)" จะส่งผลให้เกิดการกำหนดประเภทจำนวนเต็ม วงเล็บในการมอบหมายข้างต้นไม่ส่งผลต่อคำจำกัดความของประเภทและเป็นทางเลือก และการมีอยู่ของทูเพิลจะถูกกำหนดโดยพาร์เซอร์โดยขึ้นอยู่กับการมีเครื่องหมายจุลภาคเท่านั้น REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated' # จะได้รับการกำหนดสตริงแทนที่จะเป็นทูเพิล ) }
  • สถานการณ์ตรงกันข้ามคือการใช้ลูกน้ำเพิ่มเติมระหว่างการมอบหมายงาน หากทิ้งเครื่องหมายจุลภาคไว้ในตอนท้ายของงานโดยไม่ได้ตั้งใจ ทูเพิลจะถูกกำหนดให้เป็นค่าแทนประเภทปกติ (เช่น หากระบุ “value = 1” แทน “value = 1”)

ที่มา: opennet.ru

เพิ่มความคิดเห็น