В одной из моих процедур анализа я получил в качестве входных данных указатель void*
, который может быть или не быть "хорошим" указателем на строку.
Чтобы проверить случай неверного указателя, я используюпредложенный здесь вариант IsBadPointer Наиболее эффективная замена для 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;
}
К сожалению, это не работает, поскольку инструмент закрепления застревает в обработчике исключений.Любые предложения, чтобы это исправить?