https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120332
Bug ID: 120332
Summary: Line coverage for labels refers to implicit "else"
clauses before it
Product: gcc
Version: 16.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: gcov-profile
Assignee: unassigned at gcc dot gnu.org
Reporter: wentaoz5 at illinois dot edu
Target Milestone: ---
Hit the issue when measuring
https://sources.debian.org/src/lzo2/2.10-2/src/lzo1x_d.ch/#L166
How to reproduce:
$ gcc --version
gcc (GCC) 16.0.0 20250511 (experimental)
Copyright (C) 2025 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ cat > test.c << 'EOF'
int g;
void foo(int a, int b) {
if (a) {
g++;
if (b) {
g++;
} // C_else_2
} // C_else_1
// g++; // Uncommenting this changes the behavior
L1: // C_else_1 + C_else_2
if (a) {
g++;
if (b) {
g++;
} else {
g--; // C_else_2
}
} // C_else_1
// g++; // Uncommenting this changes the behavior
L2: // C_else_1
return;
}
int main(void) {
for (int i = 0; i < 1; i++)
foo(0, 0);
for (int i = 0; i < 20; i++)
foo(1, 0);
for (int i = 0; i < 300; i++)
foo(0, 1);
for (int i = 0; i < 4000; i++)
foo(1, 1);
}
EOF
$ gcc --coverage test.c -o test
$ ./test
$ gcov test
$ cat test.c.gcov
...
4321: 3:void foo(int a, int b) {
4321: 4: if (a) {
4020: 5: g++;
4020: 6: if (b) {
4000: 7: g++;
-: 8: } // C_else_2
-: 9: } // C_else_1
-: 10:
-: 11: // g++; // Uncommenting this changes the behavior
-: 12:
321: 13:L1: // C_else_1 + C_else_2
-: 14:
4321: 15: if (a) {
4020: 16: g++;
4020: 17: if (b) {
4000: 18: g++;
-: 19: } else {
20: 20: g--; // C_else_2
-: 21: }
-: 22: } // C_else_1
-: 23:
-: 24: // g++; // Uncommenting this changes the behavior
-: 25:
301: 26:L2: // C_else_1
-: 27:
4321: 28: return;
-: 29:}
...
This is suboptimal as users generally expect (1) the same number as the next
statement (2) (less commonly) how many times this label is goto'ed.
I don't know for sure at the stage of gcov instrumentation is there still
ways of doing such mapping?