Компоновщик GCC --wrap не будет переносить статическую библиотечную функцию

Я пытаюсь смоделировать функции C, используя CMocka и GCC --wrap опция компоновщика. До сих пор этот метод хорошо работал для насмешливых функций stdlib, таких как fgets, popen, pclose, так далее.

Однако сейчас я пытаюсь смоделировать функции, которые находятся в статической библиотеке, и это не работает так же хорошо. На самом деле функция статической библиотеки всегда вызывается, даже если я пытаюсь ее использовать --wrap, Мне удалось воспроизвести это в проекте foobar.

Вот исходный код моей очень простой статической библиотеки:

hello.h

#ifndef HELLO_H
#define HELLO_H

void hello();
void world();

#endif /* HELLO_H */

Привет

#include "hello.h"
#include <stdio.h>

void world()
{
    printf("world from lib\n");
}

void hello()
{
    printf("hello\n");
    world();
}

И вот исходный код моей тестовой программы:

tests.c

#include <stdarg.h>
#include <stddef.h>
#include <setjmp.h>

#include <stdio.h>

#include "cmocka.h"
#include "hello.h"


void __wrap_world(void)
{
    puts(mock_ptr_type(char*));
}

void test_hello(void **state)
{
    (void) state; /* unused */

    assert_int_equal(7, 1 + 2 * 3);

    will_return(__wrap_world, "world from tests\n");
    hello();
}

const struct CMUnitTest mytests[] = {
    cmocka_unit_test(test_hello),
};

int main(void)
{
    return cmocka_run_group_tests(mytests, NULL, NULL);
}

Наконец, строка компоновщика выглядит следующим образом (я использую CMake, поэтому он выглядит так странно), разбитая на несколько строк для ваших глаз:

/usr/bin/cc \
  -Wall -Wextra -Werror -std=c99 \
  CMakeFiles/tests.dir/tests.c.o \
  -o tests -Wl,-rpath,/home/microjoe/cmake-fail/cmocka/build/src \
  -rdynamic -lgcov /home/microjoe/cmake-fail/cmocka/build/src/libcmocka.so \
  -Wl,--wrap,world \
  -fprofile-arcs -ftest-coverage \
  ../lib/libhello.a

И, конечно же, результаты тестов, которые показывают, что функция обтекания была вызвана не так, как ожидалось:

[==========] Running 1 test(s).
[ RUN      ] test_hello
hello
world from lib
[  ERROR   ] --- __wrap_world() has remaining non-returned values.
/home/romain/cmake-fail/hello/tests/tests.c:23: note: remaining item was declared here

[  FAILED  ] test_hello
[==========] 1 test(s) run.
[  PASSED  ] 0 test(s).
[  FAILED  ] 1 test(s), listed below:
[  FAILED  ] test_hello

 1 FAILED TEST(S)

0 ответов

Другие вопросы по тегам