Есть некий код, приблизительно следующего содержания (упрощенный вариант):
TRACE((ERROR, "Bla-bla-bla. Can't create struct (%terr)", err));
Причем, как мы выяснили с большим трудом, переменная err, это не некий интовый код ошибки, а млять C++ класс! (луч поноса автору этого говна). G++ это дело находит, и, пишет предупреждение:
warning: cannot pass objects of non-POD type ‘struct cERROR’ through ‘...’; call will abort at runtime
Но это предупреждение остается незамеченным среди остальных over 9000 предупрежденией. Но G++ не просто намекает, он еще и генениует вот такой код:
0x01d4fe77 : mov DWORD PTR [ebp-0x20],eax
0x01d4fe7a : jmp 0x1d4fe7e <_ZN8KLParams11DeserializeERP13cSerializablej+668>
0x01d4fe7c : ud2a
0x01d4fe7e : mov eax,DWORD PTR [ebp-0x20]
0x01d4fe7a : jmp 0x1d4fe7e <_ZN8KLParams11DeserializeERP13cSerializablej+668>
0x01d4fe7c : ud2a
0x01d4fe7e : mov eax,DWORD PTR [ebp-0x20]
Где “ud2a” is the guaranteed illegal opcode on ia32. Пацан сказал – пацан сделал.
О чем они интересно предупреждали?