<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">