这里有几个非常严重的痛苦点。 有利的浮动点例外与有管理的编码执行严重不符。 从基本面来看,你很容易坠毁JIT-公司。 当你使用——控制87(a)时,你会遇到什么问题。
是的,如果执行原住民法典,你就有一个例外。 只有在提出例外规定时,才发出信号手,而且没有守则可以处理。 不可避免的是,在C经营时间图书馆能够看到这一例外情况之前,《刑法》委员会就看到这一例外。 因此,你从来没有听过SIGFPE手稿。
朝此方向射击的唯一适当方式是写上一部在《刑法》生效之前可以赶上例外情况的包裹。 同样非常重要的是,你必须仔细管理万国邮联控制字,你只能负担在本地法典实施期间允许万国邮联例外。 这需要一刀阔.的美术,即,你们不会享受到很多东西。
你们没有把任何刀子放下,因此,我不得不举一个sil的例子:
#include <Windows.h>
#include <signal.h>
#include <float.h>
#pragma managed(push, off)
double divisor;
void __cdecl fpehandler(int sig) {
divisor = 1.0;
}
double badmath() {
divisor = 0.0;
return 1 / divisor;
}
#pragma managed(pop)
为了获得假肢,你需要在C跑道图书馆内打电话给例外手。 很幸运的是,它暴露了,你可以把它联系起来。
// Exception filter in the CRT, it raises the signal
extern "C" int __cdecl _XcptFilter(unsigned long xcptnum,
PEXCEPTION_POINTERS pxcptinfoptrs);
你们需要确保,它只是要求有点例外。 因此,我们需要一个关注例外法的总结:
int FloatingpointExceptionFilter(unsigned long xcptnum, PEXCEPTION_POINTERS pxcptinfoptrs) {
// Only pass floating point exceptions to the CRT
switch (xcptnum) {
case STATUS_FLOAT_DIVIDE_BY_ZERO:
case STATUS_FLOAT_INVALID_OPERATION:
case STATUS_FLOAT_OVERFLOW:
case STATUS_FLOAT_UNDERFLOW:
case STATUS_FLOAT_DENORMAL_OPERAND:
case STATUS_FLOAT_INEXACT_RESULT:
case STATUS_FLOAT_STACK_CHECK:
case STATUS_FLOAT_MULTIPLE_TRAPS:
case STATUS_FLOAT_MULTIPLE_FAULTS:
return _XcptFilter(xcptnum, pxcptinfoptrs);
break;
default:
return EXCEPTION_CONTINUE_SEARCH;
}
}
现在,你可以写出一张有信号手叫来的不算术的包裹:
double badmathWrapper() {
__try {
return badmath();
}
__except (FloatingpointExceptionFilter(GetExceptionCode(), GetExceptionInformation())) {
}
}
而这又可由你从任何管理守则中呼吁的C++/CLI级。 它需要确保在发出呼吁之前允许浮动点例外,并在发出呼吁后再次恢复:
using namespace System;
using namespace System::Runtime::CompilerServices;
public ref class Wrapper {
public:
static double example();
};
[MethodImplAttribute(MethodImplOptions::NoInlining)]
double Wrapper::example() {
signal(SIGFPE, fpehandler);
_clear87();
unsigned oldcw = _control87(_EM_INEXACT, _MCW_EM);
try {
return badmathWrapper();
}
finally {
_control87(oldcw, _MCW_EM);
signal(SIGFPE, nullptr);
}
}
注意到要求——控制87(a),它使除“实际结果”外的所有浮动例外成为可能。 这样做是必要的,才能使法典被搁置。 如果你不戴面罩,那么《刑法》就死去了骇人听闻的死伤,在该网站的名称被终止之前,再一次将例外情况搁置。 希望你的信号手确实需要。