Я получил интересную ситуацию со следующим кодом:
static void DivideByZero() {
// volatile to prevent compiler optimizations.
volatile float zero = 0.0f;
volatile float result __attribute__((unused)) = 123.0f / zero;
}
DivideByZero();
int raised = fetestexcept(FE_DIVBYZERO | FE_OVERFLOW);
ASSERT_TRUE((raised & FE_DIVBYZERO) != 0);
Когда я запускаю свое устройство qemu с поддержкой KVM
, я получил следующие результаты:
FE_DIVBYZERO !=0; //and it ok
Но когда я запускаю тот же источник без поддержки KVM
:
FE_DIVBYZERO ==0; //and it not ok
Как я понимаю эту ситуацию, это происходит, потому что в mxcsr
бит регистра (div на ноль) не установлен. Но я не понимаю, почему этот бит не установлен.
Есть идеи?
ОБНОВЛЕНИЕ:
Такая же ситуация для эмулятора android
основана на qemu.
emulator -avd test -qemu
return: FE_DIVBYZERO!= 0;
emulator -avd test -qemu -disable-kvm
return: FE_DIVBYZERO == 0;