Как перехватить вызов бесплатной функции, как это делает hippomocks?

StackOverflow https://stackoverflow.com//questions/25079768

  •  02-01-2020
  •  | 
  •  

Вопрос

Мне интересно, что делает гиппомокс, чтобы перехватить exit вызовите функцию, например, как показано в приведенном ниже коде:

   MockRepository mocks;
   mocks.ExpectCallFunc(exit).With(2).Throw(std::exception());
Это было полезно?

Решение

Код, который выполняет перехват, находится в hippomocks.h.Он изменяет флаги защиты памяти, чтобы разрешить запись по адресу предоставленного указателя функции, затем записывает команду перехода вместо начальных байтов функции.Когда перехват больше не нужен, исходные байты восстанавливаются.Это тот же самый подход, который используется, например, в Обходные пути Microsoft библиотека.

Другие советы

Он преобразует переданную функцию (в данном случае простой указатель на функцию) в символ *, вежливо запрашивает у операционной системы разрешение на запись в нее (используя mprotect в Unices и VirtualProtect в Windows), а затем изменяет первые 5-14 байт, чтобы они были инструкцией безусловного перехода.Он помещает адрес сгенерированной (с использованием шаблонов) функции с идентичной подписью на это место, эффективно переопределяя функцию.

Если вы хотите, вы можете повторно использовать код HippoMocks напрямую, создав объект класса Replace в стеке с нужными аргументами.Вы также можете скопировать код (в новейших hippomocks.h на GitHub поддерживаются 32/64-разрядные версии x86, ARM и thumb).Это примерно на 200-й линии, так что относительно высоко.Вам также нужно будет скопировать класс horrible_cast и класс Unprotect;первый позволяет ему приводить указатель функции-члена к любому другому типу (что невозможно с помощью reinterpret_cast), а второй завершает специфичные для ОС вызовы unprotect (и reprotect повторно).

При очистке кода для C++11 я также извлек именно это подмножество, так что теперь вы можете использовать файл detail/replace.h, чтобы получить только код, который выполняет это.Для получения прямой ссылки посмотрите на https://github.com/dascandy/hippomocks/blob/cpp11/HippoMocks/detail/replace.h .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top