Мокинг функций (для тестирования) на C?

Я хотел бы написать тесты для библиотеки C, на C. Я хотел бы смоделировать некоторые функции для теста.

Предположим, моя библиотека скомпилирована из следующий источник:

/* foo.h */
int myfunction(int x, int y);

/* foo.c */
#include "foo.h"

static int square(int x) { return x * x; }

int myfunction(int x, int y) {
    return square(x) + square(y);
}

Я хочу написать такой тест:

/* foo_test.c */
#include "foo.h"

static int square(int x) { return x + 1; }

int main(void) {
    assert(myfunction(0, 0) == 2);
    return 0;
}

Могу ли я как-нибудь скомпилировать, чтобы myfunction использовала определение квадрат в foo_test.c вместо того, что находится в foo.c , только при компоновке исполняемого файла foo_test ? То есть я хочу скомпилировать foo.c в библиотеку (назовем ее libfoo.so ), а затем скомпилируем foo_test.c с libfoo.so и немного волшебства, чтобы я получил исполняемый файл foo_test , который использует другую реализацию square .

Было бы полезно услышать решения, когда квадрат не объявлен статическим , но решение вышеуказанного случая было бы еще лучше.

РЕДАКТИРОВАТЬ: Это кажется безнадежным, но вот идея: предположим, я компилирую с -O0 -g , поэтому маловероятно, что квадрат будет встроен, и у меня должны быть символы, показывающие, где звонок был решен. Есть ли способ проникнуть в объектный файл и заменить разрешенную ссылку?

12
задан leif 22 January 2012 в 22:38
поделиться