|
|
|
|
|
by microarchitect
4093 days ago
|
|
Honestly, 8/16b ints in C and C++ are just a minefield of problems. Here's a snippet from an open source 8051 simulator that I was debugging today: if( ((RAM[ACC] & 0xF0) >> 4) > 9 ||
GetBit(RAM[PSW], CY) == 0x01 ) {
tempAdd = RAM[ACC] + 0x60;
RAM[ACC] = tempAdd;
if( ((unsigned char*)&tempAdd)[1] != 0 ) {
SetBit(RAM[PSW], CY);
}
}
The code is supposed to set the carry flag when RAM[ACC] + 0x60 overflows into two bytes. Can you spot the bug? It involves my favorite C++ feature: implicit conversions, and my second favorite feature: signed chars.The bug is that when RAM[ACC] is something like 0xFF, it gets cast to (int) -1 so the the upper byte and hence the carry flag never get set. I predict there's lots more more evil that can milked from this fount. |
|