Könnten Sie Komponententests der relevanten Funktionen einführen, die ausschließlich dazu dienen, gcov durch direkten Angriff auf die theoretisch nicht erfassbaren Codepfade zu schließen? Da sie Unit-Tests sind, könnten sie vielleicht die "Unmöglichkeit" der Situationen ignorieren. Sie könnten die Funktionen aufrufen, die nie aufgerufen werden, ungültige Enumerationswerte übergeben, um Standardverzweigungen usw. abzufangen.
Dann führen Sie entweder diese Tests nur für die Version Ihres mit NDEBUG kompilierten Codes aus, oder führen Sie sie in einem Kabelbaum aus, der testet dass die Bestätigung ausgelöst wird - was auch immer Ihr Test-Framework unterstützt.
Ich finde es ein bisschen seltsam für die Spezifikation zu sagen, dass der Code da sein muss, anstatt die Spezifikation mit funktionalen Anforderungen an den Code. Insbesondere bedeutet dies, dass Ihre Tests diese Anforderungen nicht testen, was ein Grund ist, die Anforderungen zu erfüllen. Persönlich möchte ich die Spezifikation ändern, um zu sagen, "wenn sie mit einem ungültigen Aufzählungswert aufgerufen wird, sollte die Funktion eine assert
ausfallen. Anrufer dürfen die Funktion mit einem ungültigen Aufzählungswert im Freigabemodus nicht aufrufen". Oder so etwas.
Vermutlich was es derzeit sagt, ist im Sinne von "alle Switch-Anweisungen müssen einen Standardfall haben". Aber das bedeutet, dass Codierungsstandards das beobachtbare Verhalten stören (zumindest unter gcov beobachtbar), indem sie einen toten Code einführen. Codierungsstandards sollten dies nicht tun, daher sollte die funktionale Spezifikation, wenn möglich, die Codierungsstandards berücksichtigen.
Wenn das nicht klappt, könnten Sie vielleicht den nicht entzifferbaren Code in #if !GCOV_BUILD
einfügen und einen separaten Build für gcovs Vorteile erstellen. Dieser Build wird einige Anforderungen nicht erfüllen, aber vorausgesetzt, dass Ihre Analyse des Codes korrekt ist, gibt er Ihnen das Vertrauen, dass Sie wollen, dass die Testsuite alles andere testet.
Bearbeiten: Sie sagen, Sie verwenden einen zweifelhaften Code-Generator, aber Sie fragen auch nach einer Lösung durch Kommentieren des Quellcodes. Wenn Sie die Quelle ändern, können Sie in vielen Fällen einfach den toten Code entfernen? Nicht das Ändern der generierten Quelle ist ideal, aber die Anforderungen müssen ...
Was macht Sie so sicher, dass die Leitungen unhittable sind? Wenn Sie nicht in der Lage sind, sie zu treffen, dann versuchen Sie, dies mit Code-Coverage herauszufinden. – doron
@ deus-ex-machina399: Nein, ich habe es nicht geschafft, sie zu treffen. Es liegt am Verständnis und der Analyse des Codes. Natürlich kann ich mich irren, aber ich verwende keine Code-Coverage-Analyse, um zu versuchen, mein Verständnis des Quellcodes zu verifizieren. Ich verwende Code Coverage-Analyse, um die Qualität meiner Testsuite zu überprüfen. – jchl
@doron, ein Beispiel für Code, der nicht erfassbar sein sollte, sind Fehlerpfade in Ihrer Testinfrastruktur. Natürlich kann man auf solche Wege wahrscheinlich verzichten, aber ich habe sie. –