gpt4 book ai didi

ios - 如何在 IOS 应用程序中启用除以零的 SIGFPE 信号?

转载 作者:可可西里 更新时间:2023-11-01 05:46:13 25 4
gpt4 key购买 nike

我在 Xcode 4.5(llvm 4.1 编译器)中为 ios 5/6 开发了一个应用程序,并使用信号和异常处理程序来记录错误。但是我发现除以零永远不会引发 SIGFPE 信号。在 linux 系统上,我可以使用 feenableexcept 来设置陷阱。但这在ios中没有定义。

将适当的位设置为 fenv_t.__fpscr 不起作用,至少对于 iphone 4 和 3gs。

最佳答案

feenableexcept 函数是一个 linux 函数,不属于标准 C 或 POSIX。没有可移植的方法来启用 SIGFPE

事实上,您需要不同的代码来在 iOS 模拟器和 iOS 设备上启用 SIGFPE,因为模拟器运行 x86 而设备运行 ARM。

我认为(但尚未测试)您可以通过使用 fegetenv 函数获取 fenv_t 来启用 SIGFPE,打开一些位或在 fenv_t 中关闭,然后将其传递给 fesetenv 函数。 fenv_t 的定义是特定于处理器的。看看 fenv.h

对于 ARM,fenv_t 包含一个名为 __fpscr 的字段。这是floating point status and control register .您可以切换的位在 fenv.h 中被枚举为 __fpscr_trap_invalid__fpscr_trap_divbyzero 等。大概您想要打开 __fpscr_trap_divbyzero 位。

对于 x86,fenv_t 包含两个感兴趣的字段:__control(x87 控制字)和 __mxcsr(SSE 控制/状态寄存器).

您可以在 __control 中切换的位由 FE_INEXACTFE_UNDERFLOW 等定义在 fenv.h 中的常量定义。我认为您必须关闭这些位 off 才能为这些异常启用 SIGFPECheck the processor manual, §8.1.5 .

您可以在 __mxcsr 中切换的位由 _MM_MASK_INVALID__MM_MASK_DENORM 等常量在 xmmintrin.h< 中定义。我认为您需要关闭位 off 以启用 SIGFPE。查看处理器手册,§10.2.3。

    fenv_t fe;
if (fegetenv(&fe) != 0) {
// error
}

#if defined __arm__
fe.__fpscr |= __fpscr_trap_divbyzero;
#elif defined __i386__
fe.__control &= ~FE_DIVBYZERO;
fe.__mxcsr &= ~_MM_MASK_DIV_ZERO;
#else
#error unknown processor architecture
#endif

if (fesetenv(&fe) != 0) {
// error
}

您可能还需要为所有处理器执行#pragma STDC FENV_ACCESS ON

同样,我还没有测试过这些。祝你好运。

关于ios - 如何在 IOS 应用程序中启用除以零的 SIGFPE 信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12762418/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com