| name | lcov |
| description | LCOV tooling - finding gaps, parsing coverage files, marker syntax |
LCOV Tooling
Finding Coverage Gaps
make check-coverage
grep "^DA:" reports/coverage/coverage.info | grep ",0$"
grep "^BRDA:" reports/coverage/coverage.info | grep ",0$"
grep "^FNDA:0," reports/coverage/coverage.info
coverage.info Format
SF:/path/to/file.c # Source file
FN:42,function_name # Function at line 42
FNDA:5,function_name # Function called 5 times
DA:45,3 # Line 45 executed 3 times
DA:46,0 # Line 46 never executed (GAP!)
BRDA:50,0,0,2 # Line 50, block 0, branch 0, taken 2 times
BRDA:50,0,1,0 # Line 50, block 0, branch 1, never taken (GAP!)
end_of_record
Key patterns:
DA:line,0 = uncovered line
BRDA:line,block,branch,0 = uncovered branch
FNDA:0,name = uncovered function
Coverage Files
| Command | Output |
|---|
make check-coverage | reports/coverage/coverage.info, reports/coverage/summary.txt |
make check-coverage TEST=unit/foo | reports/coverage/unit/foo.coverage.info, .coverage.txt |
Exclusion Markers
| Marker | Effect |
|---|
LCOV_EXCL_LINE | Exclude entire line |
LCOV_EXCL_BR_LINE | Exclude branch only |
LCOV_EXCL_START / LCOV_EXCL_STOP | Block exclusion (wrapper.c only) |
Usage:
assert(ptr != NULL);
if (!ptr) PANIC("Invariant violated");
Note: Markers are NOT reliably honored inside static functions. Inline code instead.
See coverage skill for exclusion policy (what's allowed vs forbidden).
Quick Workflow
make check-coverage
cat reports/coverage/summary.txt
grep -A 1000 "SF:.*myfile.c" reports/coverage/coverage.info | \
grep -m 1 -B 1000 "end_of_record" | grep ",0$"
Related Skills
coverage - Policy (90% requirement, exclusion rules)
testability - Refactoring patterns for gaps