Подтвердить что ты не робот

Gcov warning: несоответствие слияния для резюме

Может ли кто-нибудь сказать мне, что означает сообщение gcov "Слияние несоответствия для резюме"? Я нашел сообщение в источнике gcc здесь:

http://www.opensource.apple.com/source/gcc/gcc-5646/gcc/libgcov.c

Кажется, что проверка работоспособности соответствует тегам в файлах .gcda, но я не уверен. Кто-нибудь знает, как обойти это?

4b9b3361

Ответ 1

Это происходит, когда один из объектов, которые вы связываете с исполняемым файлом, значительно меняется. Например, он получает или теряет некоторые строки профилированного кода.

Минимальный случай возникновения ошибки состоит из 2 исходных файлов. Вот два примера исходных файлов main.c...

/* main.c */
int do_stuff(int value);

int main(int argc, const char *argv[])
{
    do_stuff(argc);
    return 0;
}

и stuff.c

/* stuff.c */
#include <stdio.h>

#if 0
int more_stuff()
{
    int i;
    i = 0;
    return i;
}
#endif

int do_stuff(int value)
{
    if (value > 1) {
        printf("Value > 1\n");
    } else {
        printf("Value <= 1\n");
    }
    return 0;
}

То, что они делают, не важно. Чтобы создать их, вот простой Makefile:

CFLAGS := -fprofile-arcs -ftest-coverage
LDFLAGS := -fprofile-arcs -ftest-coverage

testexe: main.o stuff.o
    $(CC) $(LDFLAGS) -o [email protected] $^

Файл Makefile настроен таким образом, что компиляция main.c -> main.o, stuff.c -> stuff.o и, наконец, stuff.o + main.o -> testexe. Если мы скомпилируем и свяжем эти файлы C с параметрами -fprofile-arcs -ftest-coverage, тогда исполняемый файл имеет профилирование. Запустите этот execuatable, и вы получите 2 выходных файла, main.gcda и stuff.gcda. Пока все хорошо.

Теперь измените строку #if 0 на #if 1. Файл Makefile должен просто перекомпилировать stuff.c, а исполняемый файл - повторно подключиться. В следующий раз, когда запускается тестовый исполняемый файл, вы получите сообщение "Неверное слияние" для файла main.gcda. Файл stuff.gcda не затрагивается, поскольку его объектный файл был воссоздан со всей новой сводной информацией. Если вы перекомпилируете main.c и перезапустите исполняемый файл, сообщение об ошибке исчезнет.

Так что можно сделать? Хотелось бы узнать! В настоящий момент я запускаю find . -name '*.gcda' | xargs rm всякий раз, когда мне нужно перепроверить покрытие, что на самом деле не идеально. Другим решением было бы перекомпилировать все, используя профилирование "на всякий случай", но это похоже на излишнюю реакцию.