Copertura del ramo GCOVR per un caso semplice
Domanda
Ho sviluppato un semplice esempio per testare GCOVR e GCOV:
#include <iostream>
int main (int argc, const char * argv[])
{
std::cout << argc << std::endl;
if(argc == 1)
{
int y = 1;
std::cout << "Argc > 1" << std::endl;
}
if(argc == 2) std::cout << "Argc > 2" << std::endl;
if(argc == 3)
{
std::cout << "Argc > 3" << std::endl;
}
int i = 34;
i = i * i;
return 0;
}
E uno script per la generazione di report di copertura:
#! /bin/bash
rm -rf build-run
mkdir build-run
cd build-run
g++ -O6 -DDEBUG=0 --coverage -ftest-coverage -fprofile-arcs -c -o main.o ../main.cpp
g++ -O6 -DDEBUG=0 --coverage -fprofile-arcs -ftest-coverage -lgcov -o coverage ./main.o
./coverage > out
./coverage --help > out
./coverage --help --out > out
gcovr -v -kpbu -r .. -o ../branch-report.txt
gcovr -v -kpu -r .. -o ../report.txt
Ho ottenuto la copertura dell'80% usando l'opzione -B e mi indica l'ultima riga nel blocco principale. Mi sembra che dovrebbe essere al 100% per tale scenario o no?
Soluzione
Questo è un problema con GCOV. Se guardi l'output GCOV sottostante [che il driver di esempio è così cortese di lasciarci per noi come build-run/^#main.cpp.gcov], vedi:
[…snip…]
3: 21: return 0;
function _Z41__static_initialization_and_destruction_0ii called 3 returned 100% blocks executed 100%
6: 22:}
branch 0 taken 3 (fallthrough)
branch 1 taken 0
branch 2 taken 3 (fallthrough)
branch 3 taken 0
function _GLOBAL__I_main called 3 returned 100% blocks executed 100%
3: 23:/*EOF*/
call 0 returned 3
io pensare Ciò che viene segnalato è la copertura della filiale per i distruttori dei membri statici di oggetti nella libreria iostream. ... Mentre proviamo a filtrare la maggior parte della stranezza GCOV attraverso GCOVR, questo è uno dei casi che non possiamo ignorare in modo affidabile.
Bill Hart John Siirola
PS Ti incoraggio a inviare i biglietti GCOVR sulla pagina GCOVR TRAC: https://software.sandia.gov/trac/fast/newticket