ฉันกำลังอ่านโค้ดอีมูเลเตอร์บางอย่างและฉันได้ตอบโต้สิ่งที่แปลกอย่างแท้จริง:
switch (reg){
case 'eax':
/* and so on*/
}
เป็นไปได้อย่างไร? ฉันคิดว่าคุณทำได้เฉพาะswitch
ในประเภทอินทิกรัล มีกลอุบายมาโครบางอย่างเกิดขึ้นหรือไม่?
int
ดังนั้นจึงถูกต้อง อย่างไรก็ตามค่าของค่าคงที่หลายอักขระถูกกำหนดให้ใช้งานได้ดังนั้นโค้ดอาจไม่ทำงานตามที่คาดไว้ในคอมไพเลอร์อื่น ยกตัวอย่างเช่นeax
อาจจะมี0x65
, 0x656178
, 0x65617800
, 0x786165
, 0x6165
หรือสิ่งอื่น
'eax' != 'ebx'
แน่นอนดังนั้นมันจึงล้มเหลวเพียงหนึ่งหรือสองตัวอย่างของคุณ แม้ว่าอาจมีโค้ดบางส่วนที่มีผลบังคับใช้*(int*)("eax") == 'eax'
และทำให้ตัวอย่างส่วนใหญ่ของคุณล้มเหลว
'eax'
อาจเปรียบเทียบเท่ากับ'ebx'
หรือถึง'ax'
และคำสั่ง switch จะไม่ทำงานตามที่ตั้งใจไว้
'eax'
และแจกแจงค่าจำนวนเต็มคงที่