<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/149780>149780</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [LLVM-COV] The call to the standard library function isdigit() in the while loop condition leads to inccrect coverage.
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          8ss-boop
      </td>
    </tr>
</table>

<pre>
    llvm version:
clang version 21.0.0git (https://github.com/llvm/llvm-project.git 872eac7af0050813062baba9662beb81093b6b55)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /root/software/llvm-releases/llvm-0704/bin
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/11
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/12
Selected GCC installation: /usr/lib/gcc/x86_64-linux-gnu/12
Candidate multilib: .;@m64
Selected multilib: .;@m64

```c
#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(void) {
    const char *str = "12345abc67890";
    int sum = 0;
    size_t i = 0;

    while (str[i]) {
        if (isdigit((unsigned char)str[i])) {
            size_t j = i;
 while (isdigit((unsigned char)str[j]))
                ++j;
 size_t len = j - i;
            char *buf = malloc(len + 1);
 if (!buf) return 1;
            memcpy(buf, str + i, len);
 buf[len] = '\0';
            sum += atoi(buf);
            free(buf);
 i = j;
        } else {
            ++i;
        }
    }
 printf("Sum of numbers in string: %d\n", sum);
    return 0;
}
```
for the program above, we got the following coverage report from llvm-cov 

```
/*
clang -std=c2x -lm -fcoverage-mapping -fprofile-instr-generate test.c
./a.out
llvm-profdata merge default.profraw  -o default.profdata;
llvm-cov show --show-line-counts -instr-profile=default.profdata ./a.out > test.c.lcov
*/

    1| |#include <ctype.h>
    2|       |#include <stdlib.h>
    3| |#include <stdio.h>
    4|       |#include <string.h>
    5|       |
 6|      1|int main(void) {
    7|      1|    const char *str = "12345abc67890";
    8|      1|    int sum = 0;
    9|      1|    size_t i = 0;
   10|       |
   11|      6|    while (str[i]) {
   12|      5| if (isdigit((unsigned char)str[i])) {
   13|      2|            size_t j = i;
   14|      2|            while (isdigit((unsigned char)str[j]))
 15|     10|                ++j;
   16|      2|            size_t len = j - i;
   17|      2|            char *buf = malloc(len + 1);
   18|      2| if (!buf) return 1;
   19|      2|            memcpy(buf, str + i, len);
   20|      2|            buf[len] = '\0';
   21|      2| sum += atoi(buf);
   22|      2|            free(buf);
   23|      2| i = j;
   24|      3|        } else {
   25|      3|            ++i;
 26|      3|        }
   27|      5|    }
   28|      1|    printf("Sum of numbers in string: %d\n", sum);
   29|      1|    return 0;
   30| 1|}



```

the output is:
```
Sum of numbers in string: 80235
```
line 14 was executed 12 times instead of 2.

</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysV0uP4ywW_TVkc2UL4_ciCyf5MhrpG82iW71tYYwdajBEgJOq-fWfcBznVanqVymSy9zD4XKBcwy1VnSK8yVKVyjdLOjgdtosC2uDWuv9otbN21LKQw8HbqzQCsUVwhWTVHXnJiBRiEPcCQeIFDvn9tajyBaRbSfcbqhDpntEtp5negR7o184c6HvVeSEU5bTFuMUF1GMM1LTmpZZRmpeFxEu4zqr0xSREuHqKzUddyiu4LXIvmdJMKj_KX1UgRRqeA06NXjQznDaQK8bLj10r614Rbj6t7KOSsmbjTC-HZGt0dohsrW6dUdq-DlBwyWnltvzO85xgsi2FgrhaqsH1QCjqhENdRz-tV6DOFFTd6qSpx6s8d1F7SvBGCLbKeVLqmQbRX-akCBcfeGSM8eb32daz0n1g3TCd4krCFG8Qgnus-R6sKcI_8vw6cf8C4mFYnJoOKB4zdzbnoc7FP_1ELKukaJ-GhP6WcgI1c0xXAnloKdCIVIctGgQKQHlK4QrAACmlXXAdtQAIpV1BlC8AURIROIkpTXL8qLEiBA_pVMXz2eHfgTiS7MV_-ffHYjr9il03AnJ_QmxzqB0JVC6uc1ipG09QthGdMIhUiBSDGo8os2YHyLlTfdHhqssXsYsxJTdPP4PsL_M7HfM_g-RFSKrl4l2GktyNY72AsE84tXfubb10I6wnkqpGSLF2I-sIPJjnbqdaoBIVA-tn5_hbjAKokfWnvds_4ZIMSLXMK4cWYHwL5KrC6cHpCvflG6mxc1Rusb-8UA7ritZeRh1Wpz5y0dkazi_D5_W_uUWjPINcGn5O4t1Kqd4wE9v0397I5Rrx7qQL0MPugU19DU3FoSC03Y_He20Qela-c3qKzL0N4lPtTzvzJF7PpgIV6024HYc9kZ3hvZAa33gnujIodNujLVaSn0UqgOmD9zQjoPhe20ctEb3MKol0we4O_bjGd0icvGPwLoGxRtGXiGQPQTtmS_o6X7vBwjavdGtkDzwEmaCjituvBQ5bl3ohSREZEtDPTiEq7OxtA11FHpuOg4Nb-kgXeibDT0CBPqmzUNPxZjztjt9hCDwD6-GPGB6UM7ClMOUEYo39zwwJwMo_mvKMZRMH8a5j9Of5SBC-RpQvv5ACT2MeNh5T6w_0kYPid8lvdFJD0s-JL1WTg9Jb9G4gmxu8bP4UFrzG-gvim3xQPJEfssH4HuC7MP4YVIAUTQ3nmf4mWhHl_UZy_Rb-h3FM9nVsj9XdIAoedrj1-U-mhf8ukp3enXRtyj7LOv3vSHKn_b7GbcAiIpbok_9IyqfjvzjjgJA8FOaH7EbEt12_9R1CHk63ns-BEDu9tO9M5HL7omvCB-9iqTvAuHBvUj2jHEiym-Py03s8ZT_GdMjj6pwa4M-23EtfXjyxPl3bV-48v6nB7cfHAh7ugtdIz5KssAkTu_w3l4gSuBILfBXzgb_ER0RcKLndvxs97cY3QIJEa4WzTJuyrikC76M8jTGRZGk6WK3pFGKaZPxtohrxnPGeULblpWMNVlCk3QhlgSTFOckwiXGaRrWcVwSTLO8LbMmz2OUYN5TIUPvgqE23UJYO_BllJR5gReS1lza8ZJIiOJHGKO-3OlmYcYLYlAPnUUJlsI6e6Fxwsnxdvn339_-E6z_-82fiK87DoxKCU6PXxTWUdVQ04AUtaHmDdpBMX9ZgWvxKn09PfwkbVLrvTeTRoxIyWljPaFQjBnO3Px1Ei4GI5c_dy9FZDtO0V__phocluSfAAAA__8y_yRo">