【发布时间】:2011-02-04 20:52:38
【问题描述】:
运行以下代码后,我收到了 SIGILL。我实在想不通它有什么问题。
目标平台是 ARM,我正在尝试移植一个已知库(其中包含此代码)
void convertFloatToFixed(float nX, float nY, unsigned int &nFixed) {
short sx = (short) (nX * 32);
short sy = (short) (nY * 32);
unsigned short *ux = (unsigned short*) &sx;
unsigned short *uy = (unsigned short*) &sy;
nFixed = (*ux << 16) | *uy;
}
我们将不胜感激。
提前致谢
【问题讨论】:
-
在 C++ 中,第一次使用
static_cast这样的命名类型转换,第二次使用reinterpret_cast,例如:short sx = static_cast<short>(nX * 32);和unsigned short ux = reinterpret_cast<unsigned short&>(sx); -
我已将 SIGILL 的原因确定到最后一行,但不明白为什么。里面有什么问题吗?
-
我猜测代码生成错误,将返回地址吹到堆栈上。该代码提供了大量的绳索以允许编译器自行挂起。从摆脱指针转换开始,一个简单的转换就可以了。
-
实际上,当我尝试访问
sx和sy变量时,会抛出 SIGILL,所以我猜测浮点到整数的转换有问题。 -
您是否通过注释掉代码来“精确定位”这一点?如果是这样,当您注释掉最后一行时,编译器(如果优化)将丢弃整个函数体。你能反汇编这个函数,并准确地显示是哪条指令(和当时的寄存器)导致了错误吗?然后应该非常明显出了什么问题。另外,这是哪个 ARM SoC?你可能有一辆马车:)