C / C ++ สามารถเต็มไปด้วยพฤติกรรมที่ไม่ได้กำหนด มือข้างหนึ่งมันไม่ดีเท่าที่จะนำไปสู่พฤติกรรมที่ไม่คาดคิด ในทางกลับกันจะช่วยให้การเพิ่มประสิทธิภาพก้าวร้าวและมักจะเมื่อคุณใช้ C / C ++ คุณสนใจความเร็ว
การเขียนกรณีทดสอบที่อาจยาก - อาจเกี่ยวข้องกับสถาปัตยกรรมหรือคอมไพเลอร์แปลก ๆ ซึ่งไม่มีอยู่อีกต่อไป นอกจากนี้ยังอาจดูเหมือนในสถาปัตยกรรมที่มีเหตุผล "ไม่ควรทำให้เกิดปัญหาใด ๆ "
อย่างไรก็ตามเมื่อถึงจุดหนึ่งคุณจะเปลี่ยนแพลตฟอร์ม (พูด - คุณต้องการพกพาดังนั้นคุณจึงย้ายไปที่ ARM หรือต้องการเร่งความเร็วและใช้ GPU) เมื่อถึงจุดนี้สิ่งต่างๆอาจเริ่มแตกและคุณจะต้องแก้ไขข้อบกพร่อง มันอาจจะไม่สำคัญเท่ากับการอัพเดทคอมไพเลอร์ให้เป็นเวอร์ชั่นที่ใหม่กว่า (และคุณอาจต้องการ / จำเป็น)
รหัสปัญหาคือ:
int d[16];
int SATD (void)
{
int satd = 0, dd, k;
for (dd=d[k=0]; k<16; dd=d[++k]) {
satd += (dd < 0 ? -dd : dd);
}
return satd;
}
ในระหว่างการทำซ้ำครั้งล่าสุดd[++k] => d[++15] => d[16]
มีการเข้าถึง เนื่องจากโดยปกติแล้วองค์ประกอบต่อไปคือหน่วยความจำที่ถูกกฎหมาย (ในแง่ของการเพจไม่ใช่โมเดลหน่วยความจำ C) แม้แต่คอมไพเลอร์เล็กน้อยก็ไม่ได้ผลิตไฟล์ใด ๆ ที่ปฏิบัติการได้ด้วยพฤติกรรมแปลก ๆ วิธีเดียวในการเขียนกรณีทดสอบคือการหาแพลตฟอร์มที่มีโมเดลหน่วยความจำเหมือนกับ C (อาจเป็น VM)
อย่างไรก็ตาม gcc 4.8 prerelase จะเห็นว่าd[++k]
มีการดำเนินการในทุกลูป ดังนั้นk < 16
มิฉะนั้นการเข้าถึงจะผิดกฎหมายและถูกต้องตามกฎหมายของโปรแกรมที่ส่งไปยังคอมไพเลอร์เป็นส่วนหนึ่งของสัญญา ดังนั้นเงื่อนไขลูปจึงเป็นจริงเสมอตามสมมติฐานที่กำหนดดังนั้นจึงเป็นลูปไม่สิ้นสุด นี่อาจฟังดูแปลก แต่มันก็เป็นการเพิ่มประสิทธิภาพทางกฎหมายอย่างสมบูรณ์ - การเปล่งsystem("dd if=/dev/zero of=/dev/sda"); system("format c:")
ก็จะเป็นการแทนที่ที่ถูกต้องสำหรับลูป มีวิธีที่ลึกซึ้งยิ่งขึ้นที่คุณสามารถเลือกแสดงพฤติกรรมได้ ตัวอย่างเช่นระหว่างการบรรยายเกี่ยวกับTransactional Memoryฉันจำได้ว่าผู้นำเสนอพยายามหลายครั้งเพื่อให้ได้ค่าที่ผิดเมื่อ 2 เธรดเพิ่มค่าเดียวกัน
อย่างไรก็ตาม C / C ++ ตรงข้ามกับบางภาษามีมาตรฐานดังนั้นข้อพิพาทดังกล่าวสามารถทำได้โดยอ้างอิงแหล่งที่มาของวัตถุประสงค์:
- หากคุณคิดว่านี่ไม่ใช่ปัญหาลองพิสูจน์โดยใช้มาตรฐาน C / C ++ (เช่นนำไปสู่คุณค่าและพฤติกรรมที่กำหนดไว้)
- หากเขาคิดว่านี่เป็นปัญหาขอให้เขาพิสูจน์โดยใช้มาตรฐาน C / C ++ (เช่นนำไปสู่ค่าหรือพฤติกรรมที่ไม่ได้กำหนด)
โดยทั่วไปหากทีมของคุณเขียนด้วยภาษา C / C ++ มันมีประโยชน์ที่จะมีมาตรฐานอยู่ในมือ - แม้แต่ผู้เชี่ยวชาญของทีมก็สามารถพบสิ่งแปลก ๆ ที่มีอยู่เป็นครั้งคราว