id,summary,reporter,owner,description,type,status,priority,milestone,component,version,severity,resolution,keywords,cc 296,Add SIGFPE handler to all threads,dmik,,"It is known that some OS/2 system DLLs and some third party DLLs unexpectedly reset the FPU control word to a value that causes FPU exceptions to be thrown by the CPU. This may happen to any application, no matter what compiler and runtime it uses. Even if the application doesn't load the ""viral"" DLL directly, it may be injected into the process by the system (i.e. via PM DLL hooks). However, according to [http://en.wikipedia.org/wiki/IEEE_754#Exception_handling IEEE 754], the default action for FPU exceptions (e.g. divide by zero) in the compatible C runtime is to return a special value (e.g. `Inf`, infinity). This often leads to a situation when the program does something like `float f = 1.0 / .0;` and expects to get an appropriate result (`Inf` in this case) but instead it gets a `SIGFPE` and unexpectedly terminates (crashes). There are dozens of user bug reports like that and they continue to come from time to time. Some applications work around this issue by manually calling `_control87()` at appropriate times to restore the default IEEE FPU CW value that masks off all exceptions. However, this doesn't always work. First, there may be many places that can indirectly cause an exception and it's very hard to track them all to insert a `_control87()` call. Second, even if it's done, it's still theoretically possible that the viral DLL kicks in between. The only ultimate solution for the application is to install a system exception handler for each of its threads, intercept all FPU exceptions, reset the control word and retry. In fact, virtually any application needs this fix, for any of its threads (including threads created by third party library functions). Doing this over and over in each application is a pain. Functionally this definitely belongs to the C runtime. Normal programs (including third party libraries) are expected to start new threads using `beginthread()`. And this is what most applications do. So the FPU exception handler must be installed by LIBC both for `main()` and for all threads started with `beginthread()`. PS. GCC on Mac shows the correct behavior, no SIGFPE when I do things like `float f = 1.0 / .0;`. This is just to show that this is the expected behavior of the modern compiler.",defect,closed,normal,libc-0.6.6,libc,0.6.5,normal,wontfix,,