gpt4 book ai didi

c++ - 将外部错误代码映射到 std::error_condition

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:45:07 26 4
gpt4 key购买 nike

我正在考虑修改 MS 结构化异常到异常映射代码,我们必须使用新的 C++11 error_code/error_condition/exception mechanisim .

我的理解是,一般的哲学是您应该首先尝试将错误代码映射到 std::error_condition 代码,否则,制作您自己的自定义 error_condition 代码。

我看到的问题是 std::errc非常适合处理 POSIX 错误。如果我从源代码中获取的代码与典型的操作系统调用具有完全不同的错误范围,那么它就不能很好地映射。

例如,我们取 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?

那么最好的攻击方式是什么?

最佳答案

首先,正如@JamesMcNellis 所评论的那样,其中一些异常非常危险,最好让操作系统处理它们并终止您的程序,因为这些错误通常是您代码中的错误。但您可能想要处理它们并编写类似崩溃报告的内容,其中可能包含堆栈和寄存器的转储。

除此之外,std::error_conditionstd::error_code 并非仅设计用于处理 POSIX 错误。它们的结构的设计方式可以处理任何情况,即 int 值等于 0 表示成功,否则表示错误,因此您可以编写一个完全有效的代码,将它们与 std::error_codestd::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() );
}

关于c++ - 将外部错误代码映射到 std::error_condition,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13093576/

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