gcov警告:合并不匹配的摘要

mik*_*ong 21 c gcc gcov

任何人都可以告诉我gcov消息"合并错误摘要"是什么意思?我在gcc源代码中找到了这条消息:

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

这似乎是一个完整性检查,.gcda文件中的标签匹配,但我不确定.任何人都知道如何解决这个问题?

ric*_*chq 35

当您链接到可执行文件的其中一个对象发生显着变化时,就会发生这种情况.例如,它获得或丢失一些可用的代码行.

产生错误的最小情况是2个源文件.以下是两个名为main.c的示例源文件...

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

int main(int argc, const char *argv[])
{
    do_stuff(argc);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

和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;
}
Run Code Online (Sandbox Code Playgroud)

他们所做的并不重要.要构建它们,这是一个简单的Makefile:

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

testexe: main.o stuff.o
    $(CC) $(LDFLAGS) -o $@ $^
Run Code Online (Sandbox Code Playgroud)

Makefile的设置,以便编译main.c -> main.o,stuff.c -> stuff.o最后stuff.o + main.o -> testexe.如果我们使用-fprofile-arcs -ftest-coverage选项编译和链接这些C文件,那么可执行文件具有分析.运行可执行文件,你将得到2个输出文件,main.gcdastuff.gcda.到现在为止还挺好.

现在将行更改#if 0#if 1.Makefile应该只重新编译stuff.c,重新链接可执行文件.下次运行测试可执行文件时,您将收到main.gcda文件的"Merge mismatch"消息.stuff.gcda文件不受影响,因为它的目标文件已使用所有新的摘要信息重新创建.如果重新编译main.c并重新链接可执行文件,则错误消息将消失.

那可以做些什么呢?我很想知道!目前,find . -name '*.gcda' | xargs rm每当我需要重新检查覆盖范围时,我都会运行,这不是很理想.另一个解决方案是在使用"以防万一"的分析时重新编译所有内容,但这看起来有点过分.