Обертывание функций C++ с помощью GNU linker

Мне очень нравится функциональность компоновщика GNU для обертывания функций. Обычно я использую ее для насмешек, например, над недетерминированными вызовами функций типа rand(). Рассмотрим следующий пример, где я хочу написать модульный тест для giveMeANumber:

//number.cpp
int giveMeANumber() {
  return rand() % 6 + 1;
}

Я могу обернуть вызов rand с помощью функциональной обертки GNU linker вот так:

//test.cpp
extern "C" int __wrap_rand(void) {
return 4;
}

void unitTest() {
  assert giveMeANumber() == 5;
}

$ g++ test.cpp -o test number.o -Xlinker --wrap=rand

Есть ли способ сделать то же самое с обычными функциями C++? Следующий вариант не работает, я предполагаю, что это из-за искажения имен. Но даже когда я пытаюсь сделать это с искаженным именем, ничего не получается.

//number.cpp
int foo() {
  //some complex calculations I would like to mock
}
int giveMeANumber() {
  return foo() % 6 + 1;
}

//test.cpp
extern "C" int __wrap_foo(void) {
return 4;
}

$ g++ test.cpp -o test number.o -Xlinker --wrap=foo
7
задан double-beep 19 April 2019 в 11:30
поделиться