gcc趣闻ud2a指令

昨天我们的游服在测试环境下突然崩溃,gdb corefile显示错误signal 4 – Illegal instruction
QQ截图20131218093404

这个错误有别于经常遇到的段错误,它不是由内存越界造成的,而是CPU的指令非法。CPU怎么会非法指令呢?立刻查看gdb的反汇编,
看到出错那行赫然写着ud2a(见下图),ud2a这是什么指令,闻所未闻,gcc怎么会生成ud2a指令呢???
QQ截图20131218095221
求助谷歌才知道ud2a是intel cpu的一个保留指令,没有定义,一般被编译器用来提示错误。游服产生这个错误的原因是程序员把std::string printf出来时漏了向c字符串的转换(.c_str())

printf("%s", str.c_str());

被打成了

printf("%s", str);

gcc发现了这个错误,在编译的时候在这里插入了ud2a指令,防止错误蔓延。可是gcc为什么不在编译时直接报错而要这个样子呢?求解释!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.