我正在考虑修改MS结构化异常到异常映射代码,我们必须使用新的C ++ 11 error_code/error_condition/exception mechanisim。
我的理解是,一般的哲学是你应该首先尝试将你的错误代码映射到std :: error_condition代码,否则,制作你自己的自定义error_condition代码。
我发现问题std::errc非常适合与POSIX错误配合使用。如果我从一个源代码中获取代码,该代码具有与典型OS调用相比差异很大的错误,那么它就不能很好地映射。
例如,我们可以Microsoft's SEH codes。这些来自操作系统,所以理论上它应该映射以及POSIX之外的任何东西。但它确实似乎没有很好地映射:
EXCEPTION_ACCESS_VIOLATION = permission_denied
EXCEPTION_ARRAY_BOUNDS_EXCEEDED = argument_out_of_domain perhaps?
EXCEPTION_BREAKPOINT = ?
EXCEPTION_DATATYPE_MISALIGNMENT = ?
EXCEPTION_FLT_DENORMAL_OPERAND = ?
EXCEPTION_FLT_DIVIDE_BY_ZERO = ?
EXCEPTION_FLT_INEXACT_RESULT = ?
EXCEPTION_FLT_INVALID_OPERATION = ?
EXCEPTION_FLT_OVERFLOW = ?
EXCEPTION_FLT_STACK_CHECK = ?
EXCEPTION_FLT_UNDERFLOW = ?
EXCEPTION_GUARD_PAGE = ?
EXCEPTION_ILLEGAL_INSTRUCTION = ?
EXCEPTION_IN_PAGE_ERROR = ?
EXCEPTION_INT_DIVIDE_BY_ZERO = ?
EXCEPTION_INT_OVERFLOW = value_too_large perhaps, but then what do I use for _STACK_OVERFLOW?
EXCEPTION_INVALID_DISPOSITION = ?
EXCEPTION_INVALID_HANDLE = ?
EXCEPTION_NONCONTINUABLE_EXCEPTION = ?
EXCEPTION_PRIV_INSTRUCTION = ?
EXCEPTION_SINGLE_STEP = ?
EXCEPTION_STACK_OVERFLOW = value_too_large perhaps, but then what do I use for _INT_OVERFLOW?
那么攻击它的最佳方法是什么?
答案 0 :(得分:2)
首先由@JamesMcNellis评论这些异常是非常危险的,让操作系统处理它们并终止你的程序可能会更好,因为这些错误通常是代码中的错误。但是,您可能想要处理它们并编写类似崩溃报告的内容,可能会使用堆栈和寄存器转储。
除此之外,std::error_condition
和std::error_code
并非旨在仅处理POSIX
错误。它们的结构设计方式可以处理任何int
值等于0表示成功的情况,否则表示错误,因此您可以编写一个完全有效的代码,将std::error_code
与它们一起使用和std::error_condition
但你应该从std::error_category
开出一个类并实现其虚函数,以提供与错误代码匹配的错误代码的说明(在你的情况下是NT状态代码):
class NT_status_code_error_category : std::error_category {
public:
const char* name() const {return "NT status code";}
std::string message( int errCode ) const {
switch( errCode ) {
case EXCEPTION_ACCESS_VIOLATION: return "Access violation";
// a couple of other error codes will be handled here
default: return "Unknown status code";
}
}
std::error_condition default_error_condition( int errCode ) const {
return std::error_condition( errCode, *this );
}
};
inline NT_status_code_error_category const& NT_status_code_category() {
static NT_status_code_error_category res;
return res;
}
inline std::error_code make_NT_status_error_code( int status ) {
return std::error_code( status, NT_status_code_category() );
}
inline std::error_condition make_NT_status_error_condition( int status ) {
return std::error_condition( status, NT_status_code_category() );
}