2017-12-24 11 views
2

Ich versuche, lcov (v1.13, auf OS X, mit clang als Compiler) zu verwenden, um Codeabdeckung für meine Testsuite zu generieren, und ich habe eine nervige getroffen Problem, das ich nicht lösen kann. Es gibt ein paar ähnliche Fragen zu SO, aber ich konnte keine Lösung für dieses Problem finden. Aus irgendeinem Grunde Funktion/Mitglied Erklärungen werden als erreichbar markiert, aber nicht ausgeführt, die Art wie im Beispiel unten (dies ist Inline-Methode Definition in einem Header):lcov Markierungslinien mit Funktionsdeklarationen als erreichbar, aber nicht abgedeckt

enter image description here

Diese Linie Deckungsmaß unbrauchbar macht, Ich habe gehofft, dass es einen Weg gibt, es zu beheben, ohne jede Deklaration als LCOV_EXCL_LINE zu markieren.

Compiler-Flags verwendet werden, sind ziemlich Standard:

-g -O0 -fno-inline -ftest-coverage -fprofile-arcs -fno-elide-constructors 

Was das Verfahren seltsam ist, Definitionen in Quelldateien werden auch als rot markiert, obwohl die Körper nicht, zum Beispiel:

// header.h 
class Foo { 
    void bar();  // ignored, marked as unreachable 
} 

// header.cpp 
void Foo::bar() { // marked as red (reachable/not executed) 
    do_something(); // marked as covered 
} 

Wenn es von Bedeutung ist, sind die Quelldateien Teil einer statischen Bibliothek, die in CMake statisch mit der Testumgebung verbunden ist.

Antwort

1

meine eigene Frage zu beantworten:

Offenbar nimmt lcov -i (anfängliche Erfassung), die Ausgangsleitungen von Funktionen instrumentiert werden, während mit LLVM sie eigentlich nicht sind (während bei GCC, wo sie sind). Es gibt ein vorgeschaltetes GitHub-Problem (linux-test-project/lcov#30), das dies ausführlicher dokumentiert.

Bis zu diesem befestigt ist, in lcov stromaufwärts, ich habe einen einfachen workaround geschrieben - einen Python-Skript, die Funktion Startlinien aus Basisabdeckung Datei entfernt, die „Fix“ sollten es zumindest vorübergehend.

Verwandte Themen