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.

Reply via email to