Frage

Ich bin mit gcov zu messen Berichterstattung in meinem C ++ Code. Ich möchte 100% Deckung bekommen, aber ich durch die Tatsache erschwert, dass es einige Zeilen Code sind, die theoretisch un-hittable (Methoden, die implementiert werden, sind erforderlich, um die jedoch nie, Standardzweige switch Aussagen genannt, etc.). Jeder dieser Zweige enthält eine assert( false ); Aussage, aber gcov noch Markierungen sie als un-Hit.

Ich möchte in der Lage sein gcov zu sagen, diese Zweige zu ignorieren. Gibt es eine Möglichkeit gcov, dass die Informationen zu geben - durch den Quellcode mit Anmerkungen versehen oder durch einen anderen Mechanismus

War es hilfreich?

Lösung

Bitte verwenden lcov. Es verbirgt gcov Komplexität erzeugt schöne Leistung, ermöglicht eine detaillierte Ausgabe pro Test zeichnet sich durch einfache Dateifilterung und - ta-taa - Linienmarkierungen für bereits überprüft Zeilen:

Von geninfo (1):

  

Die folgenden Markierungen von geninfo erkannt werden:

     
      
  • LCOV_EXCL_LINE   
        
    • Die Linien dieser Marker enthält ausgeschlossen werden.
    •   
  •   
  • LCOV_EXCL_START   
        
    • markiert den Beginn eines ausgeschlossenen Abschnitt. Die aktuelle Zeile ist Teil dieses Abschnitts.
    •   
  •   
  • LCOV_EXCL_STOP   
        
    • kennzeichnet das Ende eines ausgeschlossenen Abschnitt. Die aktuelle Zeile nicht Teil dieses Abschnitts.
    •   
  •   

Andere Tipps

Ein Tool namens gcovr verwendet werden kann, die Ausgabe von gcov zusammenzufassen und (from mindestens Version 3.4 ) es die gleichen Ausschlussmarker wie lcov unterstützt.

diese Antwort :

  

Die folgenden Markierungen von geninfo erkannt werden:

     
      
  • LCOV_EXCL_LINE      
        
    • Die Linien dieser Marker enthält ausgeschlossen werden.
    •   
  •   
  • LCOV_EXCL_START      
        
    • markiert den Beginn eines ausgeschlossenen Abschnitt. Die aktuelle Zeile ist Teil dieses Abschnitts.
    •   
  •   
  • LCOV_EXCL_STOP      
        
    • kennzeichnet das Ende eines ausgeschlossenen Abschnitt. Die aktuelle Zeile nicht Teil dieses Abschnitts.
    •   
  •   

Sie können auch 'LCOV' oben mit 'GCOV' oder 'GCOVR' ersetzen. Sie alle arbeiten.

Könnten Sie Unit-Tests der relevanten Funktionen einführen, die zu schließen gcov allein existieren, indem direkt auf die theoretisch-unhittable Codepfade angreifen? Da sie sind Unit-Tests, könnten sie ignorieren vielleicht die „Unmöglichkeit“ der Situationen. Sie konnten die Funktionen aufrufen, die nie aufgerufen werden, übergeben ungültige ENUM-Werte zu fangen Standard Zweige usw.

Dann entweder diese Tests laufen nur auf der Version des Codes mit NDEBUG zusammengestellt oder auch sie in einem Gurtzeug, welche Tests ausgeführt werden, dass die Assertion ausgelöst wird -. Was auch immer Ihre Test-Framework unterstützt

Ich finde es ein wenig seltsam, obwohl für die Spezifikation zu sagen, dass der Code, dort zu sein hat, und nicht die Spezifikation enthält funktionale Anforderungen an dem Code. Insbesondere bedeutet dies, dass die Tests nicht diese Anforderungen testen, die ein so guter Grund, wie jeder ist Anforderungen funktional zu halten. Persönlich würde ich will die Spezifikation ändern, zu sagen: „Wenn mit einem ungültigen Enum-Wert genannt, wird die Funktion einen assert versagen. Callers wird die Funktion mit einem ungültigen Enum-Wert im Release-Modus nicht aufrufen“. Oder so ähnlich.

Vermutlich, was es zur Zeit sagt, ist entlang der Linien von „alle Switch-Anweisungen einen Standardfall müssen“. Das bedeutet aber, Codierungsstandards stören mit beobachtbare Verhalten (zumindest beobachtbaren unter gcov) von totem Code einzuführen. Coding-Standards sollten das nicht tun, so die funktionale Spezifikation aufgrund der Codierungsstandards, wenn möglich nehmen.

Gelingt das nicht, könnten Sie vielleicht den unhittable Code in #if !GCOV_BUILD wickeln und profitieren über einen separaten Build für gcov ist. Dieser Build wird einige Anforderungen scheitern, aber davon abhängig Ihre Analyse des Codes ist richtig, es gibt Ihnen die Sicherheit, die Sie möchten, dass die Test-Suite-Tests alles andere.

Edit: Sie sagen, Sie sind mit einem zwielichtigen Code-Generator, aber Sie sind auch nach einer Lösung gefragt durch den Quellcode mit Anmerkungen versehen. Wenn Sie die Quelle sind zu ändern, können Sie nur den toten Code in vielen Fällen entfernen? Nicht, dass das Ändern erzeugte Quelle ist ideal, aber es sein muss ...

Ich glaube nicht, dies möglich ist. Gcov hängt von gcc zusätzlichen Code zu erzeugen, um die Abdeckung Ausgabe zu erzeugen. Gcov selbst analysiert nur die Daten. Dies bedeutet, dass Gcov kann den Code nicht analysieren besser als jede gcc (und ich nehme an, Sie -Wall verwenden und entfernte Code als nicht erreichbar gemeldet).

Beachten Sie, dass relocatable Funktionen können von überall, möglicherweise auch externe DLLs oder ausführbare Dateien aufgerufen werden, so gibt es keine Möglichkeit der Compiler wissen kann, was relocatable Funktionen nicht aufgerufen werden oder welche Eingabe diese Funktionen haben können.

Sie müssen wahrscheinlich einige facy statische Analyse-Tool verwenden, um die Informationen zu bekommen, die Sie wollen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top