我正在尝试将最初为x86架构编写的代码移植到arm.
最初它是为msvc/win32开发的,代码中有很多错误,所以可能有UB.
当使用gcc编译时,代码正在使用x86,但是它有不同的行为.它似乎丢失了数组中的一些数据,武器开关不起作用.它影响了服务器和客户端库.
应用程序是单线程的,因此不是同步问题.
默认情况下,char在arm上是无符号的,所以我添加-fsigned-char到编译器标志,但它没有解决问题.arm和x86 c代码之间还有什么区别?
我尝试使用gcc和clang在arm上编译代码并且没有区别,因此它不是编译器错误.
PS我使用gcc-4.9(而不是4.8)编译了x86的代码,并得到了相同的行为.之后,我结合了两个编译器,发现问题出在net_encode.c中.
到那时,塞巴斯蒂安骑士发现了这一点
iValue /= pField->multiplier;
iValue *= pField->multiplier;
当iValue为整数且pField-> multiplier == 1.0f时,有时会更改整数值.
可以通过在乘法之前添加检查pField-> multiplier!= 1.0f来修复它.