https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121409
Bug ID: 121409 Summary: [GCOV] A simple if-statement inside nested structure gets wrong coverage. Product: gcc Version: 16.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: gcov-profile Assignee: unassigned at gcc dot gnu.org Reporter: njuwy at smail dot nju.edu.cn Target Milestone: --- gcc version: gcc version 16.0.0 20250804 (experimental) (GCC) cmd: gcc --coverage -std=c2x -lm -O0 test.c -o test ./test gcov ./*.gcda -t > test.c.gcov $ cat test.c #include <stddef.h> #include <ctype.h> #include <stdlib.h> #include <stdio.h> int process_array(const int *data, size_t len, nullptr_t nptr) { int sum = 0; size_t i = 0; while (i < len) { char c = (char)(data[i] & 0xFF); if (nptr == nullptr && isdigit(c)) { sum += data[i] % 10; if (sum > 100) { sum += 1; } else { sum += 2; } } else { sum -= (int)len; break; } i += (sum & 1) ? 1 : 2; } return sum; } int main(void) { int arr[] = { 52, 65, 50, 53, 90 }; nullptr_t nptr = nullptr; printf("%d\n", process_array(arr, 5, nptr)); return EXIT_SUCCESS; } $ cat test.c.gcov -: 1:#include <stddef.h> -: 2:#include <ctype.h> -: 3:#include <stdlib.h> -: 4:#include <stdio.h> 1: 5:int process_array(const int *data, size_t len, nullptr_t nptr) -: 6:{ 1: 7: int sum = 0; 1: 8: size_t i = 0; 3: 9: while (i < len) { 3: 10: char c = (char)(data[i] & 0xFF); 3: 11: if (nptr == nullptr && isdigit(c)) { 2: 12: sum += data[i] % 10; 4: 13: if (sum > 100) { #####: 14: sum += 1; -: 15: } else { 2: 16: sum += 2; -: 17: } -: 18: } else { 1: 19: sum -= (int)len; 1: 20: break; -: 21: } 2*: 22: i += (sum & 1) ? 1 : 2; -: 23: } 1: 24: return sum; -: 25:} 1: 26:int main(void) -: 27:{ 1: 28: int arr[] = { 52, 65, 50, 53, 90 }; 1: 29: nullptr_t nptr = nullptr; 1: 30: printf("%d\n", process_array(arr, 5, nptr)); 1: 31: return EXIT_SUCCESS; -: 32:} Cov of line 13 should be 2 instead of 4.