在我的一个分析例程中,我收到一个void*
指针作为输入,这可能是一个指向字符串的“好”指针。
要检查错误指针的情况,我使用此处提出的IsBadPointer变体Most efficient replacement for IsBadReadPtr?
然而,这并不完全可靠。所以,我想捕获引发RECEIVED_ACCESS_FAULT异常,当它试图引用一个错误的指针时,将指针的值更改为一个好的值,然后继续执行。
所以,为了尝试这一点,我在我的分析例程中引用了一个全局NULL指针(string_pointer
),并按如下方式设置了异常处理程序:
EXCEPT_HANDLING_RESULT ExceptionHandler(THREADID tid, EXCEPTION_INFO *pExceptInfo, PHYSICAL_CONTEXT *pPhysCtxt, VOID *v)
{
EXCEPTION_CODE c = PIN_GetExceptionCode(pExceptInfo);
EXCEPTION_CLASS cl = PIN_GetExceptionClass(c);
std::cerr << "Exception class " << cl << endl;
std::cerr << PIN_ExceptionToString(pExceptInfo) << endl;
//Change string_pointer contents from NULL
string_pointer = "<Invalid Memory>";
return EHR_HANDLED;
}
不幸的是,这不会起作用,因为pin工具卡在异常处理程序中。有什么建议可以解决这个问题吗?
答案 0 :(得分:1)
您应始终使用PIN_SafeCopy()从declared访问分析例程中的应用程序内存,如下所示:
size_t LEVEL_PINCLIENT::PIN_SafeCopy(VOID* dst, const VOID* src, size_t size)
该函数返回从源缓冲区成功复制的字节数。因此,您可以将其与size
进行比较,以确定它是否完全成功。 PIN_SafeCopyEx()
是一个类似的功能,可在发生故障时提供附加信息。