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

    <tr>
        <th>Summary</th>
        <td>
            [LLVM-COV]  The use of the global variable errno  leads an incorrect coverage statistic.
        </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 <stdatomic.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
int main() {
 atomic_int ai = 42; 
    int i = 0;
    volatile int flag = 1;
    while (flag) {
        switch (i++) {
            case 0:
                if (atomic_fetch_add(&ai, 1) >= 45)
                    flag = 0;
 break;
            case 1:
                if (atomic_load(&ai) % 2 == 0)
                    errno = EDOM;
                else
 errno = ERANGE;
                break;
            case 2:
 if (errno != EDOM && errno != ERANGE)
                    flag = 0;
 break;
            default:
                flag = 0;
 }
    }
    printf("Final atomic value: %d\n", atomic_load(&ai));
 return atomic_load(&ai);
}
```
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 <stdatomic.h>
    2|       |#include <errno.h>
    3| |#include <stdlib.h>
    4|       |#include <stdio.h>
    5|      1|int main() {
    6|      1|    atomic_int ai = 42; 
    7|      1|    int i = 0;
    8|      1|    volatile int flag = 1;
    9|      5|    while (flag) {
   10|      4|        switch (i++) {
   11|      1|            case 0:
 12|      1|                if (atomic_fetch_add(&ai, 1) >= 45)
   13| 0|                    flag = 0;
   14|      1|                break;
   15| 1|            case 1:
   16|      1|                if (atomic_load(&ai) % 2 == 0)
   17|      1|                    errno = EDOM;
   18|      1|                else
   19|      1| errno = ERANGE;
   20|      1|                break;
   21|      1| case 2:
   22|      1|                if (errno != EDOM && errno != ERANGE)
   23|      0|                    flag = 0;
   24|      1| break;
   25|      1|            default:
   26|      1| flag = 0;
   27|      4|        }
   28|      4|    }
   29|      1| printf("Final atomic value: %d\n", atomic_load(&ai));
   30|       | return atomic_load(&ai);
   31|      1|}

```

the output is:
```
Final atomic value: 43
```
Line 19 was actually executed instead of line 17.

</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysV12PmzoT_jXOzQhkm_B1kQs22VSv1L6Vzql6WxkYiE8dHNkm2f77IwNJNl_d7WkREruexzPPjO1nYmGtbDvEBYmfSLyaid5ttFlk1gal1rtZqesfC6X2W9ijsVJ3JCoILSoluvY4BJyFNKStdEB4tnFuZz2Krwlft9Jt-jKs9JbwtfczfYKd0f9g5UI_K0s5iioVDaUxzVhEE16KUuRJwkssM0bzqEzKOCY8J7T4IkyLjkQFvGTJt2Qe9N33Th-6QMmufwnarvegjUFRw1bXqDx0p618IbT4X2edUArrlTR-nPC10doRvra6cQdh8EjQoEJh0R7_pymdE74uZUdosdZ9V0MlulrWwiF8WC5Bjq6FG6vkXffW-Omy9JWoKsLXE-UzVb5m7E875IQWf6PCymH9-56WJ1LbXjnpp0QFhCR6InO6Teavgz1E-Deh41v5f3gku0r1NQKJltbVwumtrMINiZ5vzGhMp--brKuVLB_a5Gma7BxshewIzwjPgaRPhBYwRv3mjUICiVYw5yR6Am8DAD8-DlOfzDi4176QCgdro0Q7ANgZcNh4K-GZN74KNj32IF218XZJ-NPwXkP8UwmLPmxxNT7wavz0iXyDrtp8E3U9pJYISfgS2OA0eh5Smg7OtRf_nPgfEywNiu_nXC7YsHewUVq8IpID4TFwH2EM8pDIsMYDk-fV50-3BAaMsuiHX2H_Kv7_4fk--meZ8CmTkfrkj7NjeCA8ITyBS8MY67dLWWMjeuXu1_LGCUlXE-z8187IzjVDlfladkJN-xj2QvU4HvC4JvGyI5z73XB_bfw7BjHoetM9gg2YMfrpDBNaNNqA2yDsjG6N2IIo9R59tANCq91ga7RS-iC7Fiq9RyNaBIM7bRw0Rm9hENZK7-FKIYajvCb83GoC62oSrSr-AoHaQtAc_QVbsdv5AEGzM7qRCgOvdiZosUPjVcuhdaHXnJDwtQh17wgtjj2oqYUTsEXT4nFhQj9sxAEg0BdjHjoW48TbbvQBgsB_vHBiUOm-cxYmDhMjEq2u_cCJjD-lE8dQVXo_5D6kT48bhJF0CSRdviGaHso9dHxuJlzIqEdEj_y-klSPm__E6YXIekR8Anva92UXAJILmP--ocXpzYS76pzdwN7U6_w05cj9sYIzegK_qsobms7YDakLNTqqPOMPcfA7qs-GhaZ3XN6VHAA2_ymRS2FjQ9XuJnZuGOx2vR-m9s4Wwm53xPXzoKmw201yMWtqMwAsvwQ-bDyc_kLB-NV2uOhIAPw9u-A_tSwenfz9wmbgV5vhKpn4IdvrRsev9sC9WOnd43VqfTy7sZ9tV4v1x7skQEQvlPA9fdPPulzvqZNetTta-H6pe7frHUg7Fu014n4K8-gK9lF2CCyHg7AgKtcLpX4AvmDV-9_nvi35e5FuQA3ANCS0mNWLqM6jXMxwwdI4ohmPOJttFklURfMyS6OMY00bkXGRN_MYS1omZUTZTC445TFNOaMpy-YsTJKM5pHgcc1SwfKIzCluhVShb5mhNu1MWtvjgs3zNMlnSpSo7HD55LzDAwxWvx7xamaGi2dQ9q0lc6qkdfbsxkmnhlvrx49fPwXLz19JvAL4skHoLfr8fDlbpUuhYC-MFKXC6XCAQlFbEB3IrtLGYOXOP0-sE05aJ6tw1hu1-LXbLOHrIQF_aZwy3C_4vwEAAP__bfMdgg">