Intel Pin: правильно продолжает выполнение после исключения RECEIVED_ACCESS_FAULT - PullRequest
0 голосов
/ 01 июня 2018

В одной из моих процедур анализа я получил в качестве входных данных указатель 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;
}

К сожалению, это не работает, поскольку инструмент закрепления застревает в обработчике исключений.Любые предложения, чтобы это исправить?

1 Ответ

0 голосов
/ 01 июня 2018

Вы всегда должны обращаться к памяти приложения из своих процедур анализа, используя PIN_SafeCopy () , что объявлено следующим образом:

size_t LEVEL_PINCLIENT::PIN_SafeCopy(VOID* dst, const VOID* src, size_t size)

Функция возвращает числобайт успешно скопированы из исходного буфера.Таким образом, вы можете сравнить его с size, чтобы определить, был ли он полностью успешным или нет.PIN_SafeCopyEx() - аналогичная функция, предоставляющая дополнительную информацию в случае сбоя.

...