เปรียบเทียบภาษาการเขียนโปรแกรม
C: ภาษาที่ทุกสิ่งทุกอย่างทำงานอยู่
C คือภาษาที่อยู่ภายใต้ทุกสิ่งทุกอย่าง: เคอร์เนล, ไดรเวอร์, ล่ามที่เซิร์ฟเวอร์ Python ของคุณทำงาน, เอ็นจิ้นฐานข้อมูลที่อยู่เบื้องหลังเว็บไซต์ของคุณ สำหรับทีมปฏิบัติการ C ไม่ใช่สิ่งที่คุณเขียนทุกวัน แต่เป็นสิ่งที่คุณต้องอ่านอย่างคล่องแคล่วมากกว่า เนื่องจากการเขียน CVE, Stack Tracs และ Core dumps ดำเนินธุรกิจของพวกเขาโดยใช้คำศัพท์ของ C นี่คือบทความเฉพาะเบื้องหลังการเปรียบเทียบ C-vs-C++ ของเรา
ประเด็นสำคัญ
- โมเดลมีความซื่อสัตย์: หน่วยความจำแบบแมนนวลผ่าน malloc/free เลขคณิตบนพอยน์เตอร์ และพฤติกรรมที่ไม่ได้กำหนดไว้เป็นความจริงระดับข้อมูลจำเพาะแทนที่จะเป็นหมวดหมู่ข้อบกพร่อง วินัยที่ทำให้ C เร็วนั้นเป็นวินัยเดียวกับที่ทำให้ C ประมาทมีราคาแพง
- พฤติกรรมที่ไม่ได้กำหนดไว้ถือเป็นอันตรายแบบหมุนเวียน: การจัดทำดัชนีนอกขอบเขต การโอเวอร์โฟลว์ที่เซ็นชื่อ คลาสที่ไม่ต้องใช้งานซึ่งสอดคล้องโดยตรงกับกลุ่มผลิตภัณฑ์ CVE ด้านความปลอดภัยของหน่วยความจำ (เกือบจะเสียบปลั๊กทีละตัวในข้อมูล CVE ในรอบหลายทศวรรษ) fuzzers (เครื่องมือระดับ AFL-libFuzzer) และสารฆ่าเชื้อเปลี่ยนการเดาให้กลายเป็นเงื่อนไขที่ทำซ้ำ
- เครื่องมือตรวจแก้จุดบกพร่องเป็นอุปกรณ์ระดับโลกและน่ารู้: gdb, valgrind/memcheck, AddressSanitizer และ kin (UBSan, TSan) ตรวจจับคลาสของจุดบกพร่องในเวลาทดสอบ ซึ่งการติดตามสแต็กการผลิตเป็นเพียงนัยเท่านั้น การผสมผสานดังกล่าวจึงเป็นเหตุผลว่าทำไม 'สร้างด้วยน้ำยาฆ่าเชื้อใน CI' จึงเป็นกฎประจำบ้านในทุกทีม C-heavy ที่เราร่วมงานด้วย
- การอ่าน C เป็นทักษะการปฏิบัติงาน: CVE ประกาศฟังก์ชันและประเภทอ้างอิง segfault ของบริการสร้าง backtraces ในคำศัพท์ gdb และการสร้างแพ็คเกจจากแหล่งที่มาของพอร์ตทรีคลาสจะแสดงคำเตือนของคอมไพเลอร์ที่แยกคุณภาพออกจากขยะ ข้อได้เปรียบของผู้อ่านผสมผสานกันอย่างเงียบ ๆ เป็นเวลาหลายปี
- ABI เป็นเนื้อเยื่อเกี่ยวพัน: 'อินเทอร์เฟซฟังก์ชันต่างประเทศ' ทุกอัน (ctypes ของ Python, FFI ของ Rust, cgo ของ Go) เป็นรูปตัว C เพราะ C กลายเป็นภาษากลางของขอบเขตห้องสมุด บทบาทนั้นทำให้ C มีความเกี่ยวข้องโดยไม่คำนึงถึงแฟชั่นของนักพัฒนา
- เมื่อ C ยังคงเป็นเครื่องมือที่เหมาะสมในการเขียน: เคอร์เนล ไดรเวอร์ เฟิร์มแวร์แบบฝัง และลูปในสุดที่พฤติกรรมแคชมีอิทธิพลเหนือ ที่อื่นการเปรียบเทียบภาษา (สนิมสำหรับการเขียนส่วนประกอบ C ที่ไม่ปลอดภัยอย่างปลอดภัย, ไปใช้เครื่องมือปฏิบัติการ) ครอบคลุมตัวเลือกสมัยใหม่ที่ซื่อสัตย์
บันทึกจากหน้างาน
จุดบกพร่อง C ที่ทำให้เราจัดระบบน้ำยาฆ่าเชื้อใช้เวลาสามสัปดาห์ในการค้นหาตามนิทานพื้นบ้านแบบ stack-trace และสามนาทีภายใต้ AddressSanitizer: ระบบนิเวศของคอมไพเลอร์รู้อยู่แล้วว่าสิ่งใดที่มนุษย์ไม่ควรสแกนหาในเวลาตี 2
คำถามที่พบบ่อย
เราควรเขียนโครงสร้างพื้นฐานใหม่ใน C หรือไม่?
แทบจะไม่เคยทั้งหมดเลย: โดยที่การควบคุมสูงสุดมีความสำคัญ เคอร์เนลและไดรเวอร์ยังคงอยู่ C; บริการและเครื่องมือปรับใช้ Python/Go/Rust ได้แล้ววันนี้ C-core-with-safe-edges เป็นรูปทรงที่ทันสมัยและใช้งานได้จริง
เหตุใด C จึงถูกตำหนิสำหรับ CVE จำนวนมาก
เนื่องจากจุดบกพร่องด้านความปลอดภัยของหน่วยความจำอาศัยอยู่ตรงกับที่ UB อาศัยอยู่ และเนื่องจากโค้ดที่สำคัญของโลกมีส่วนแบ่งมหาศาลเช่นนี้ ผู้จัดการจะบรรเทาปัญหาผ่านเครื่องมือหน่วยความจำที่ปลอดภัยกว่า การคลุมเครือ และการเขียนซ้ำแบบกำหนดเป้าหมายตามแนวทางปฏิบัติ 'การพัฒนาเชิงรุก'
ผู้ดูแลระบบสามารถเรียนรู้การอ่าน C ได้อย่างมีประสิทธิภาพได้อย่างไร
เลือกแหล่งบริการที่แท้จริง: แพ็คเกจที่มีโค้ดเบสขนาดเล็ก (curl เป็นการเริ่มต้นที่ดี) อ่านรายงาน CVE เทียบกับการแก้ไข และฝึกฝนกับ gdb ในกล่องทดสอบ ความคล่องแคล่วคือสองสามวันหยุดสุดสัปดาห์บวกกับสิ่งประดิษฐ์จริง
Modern C (C17/C23) แตกต่างพอที่จะเปลี่ยนเรื่องราวหรือไม่?
ส่วนเพิ่ม: มาตรฐานมีการพัฒนาอย่างระมัดระวัง แต่โมเดลหน่วยความจำและภูมิทัศน์ของ UB ยังคงเป็นความจริงที่มีมายาวนาน การใช้เครื่องมือไม่ใช่การปั่นแบบมาตรฐานคือจุดที่ความก้าวหน้าด้านความปลอดภัยเกิดขึ้น
Kinetikatech ช่วยเรื่อง เปรียบเทียบภาษาการเขียนโปรแกรม ได้อย่างไร
นี่คือสิ่งที่เราทำทุกวัน: ภาษาสำหรับงานระบบ การเขียนสคริปต์ และบริการ เปรียบเทียบกับสิ่งที่สำคัญจริง ๆ ในการผลิต: การรับประกันความปลอดภัย ความเร็วเบื้องต้น ใครที่คุณสามารถจ้างได้ และความเจ็บปวดของบริการที่เกิดขึ้นในการปรับใช้และแพตช์ บริการ การจัดการเซิร์ฟเวอร์และการบำรุงรักษาเว็บไซต์ ของเราดูแลครบวงจร ตั้งแต่ประเมิน ลงมือทำ ติดตาม 24 ชั่วโมง ไปจนถึงรับเรื่องฉุกเฉินภายใน 30 นาที