<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/149772>149772</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[LLVM-COV] Macro statements cause incorrect coverage for switch-case statements
</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 <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#define SW(n, c) case n: return (int)(c)
int get_value(char ch)
{
if (isalnum(ch))
switch (ch) {
SW('0', -1);
SW('1', 2);
SW('2', 3);
SW('3', 5);
SW('4', 7);
SW('5', 11);
SW('6', 13);
SW('7', 17);
SW('8', 19);
SW('9', 23);
SW('a', 29);
SW('A', 29);
}
return -1;
}
int main(void)
{
char input = '7';
int result = get_value(input);
printf("Value for '%c': %d\n", input, result);
return EXIT_SUCCESS;
}
```
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 <stdio.h>
2| |#include <ctype.h>
3| |#include <stdlib.h>
4| 1|#define SW(n, c) case n: return (int)(c)
5| |int get_value(char ch)
6| 1|{
7| 1| if (isalnum(ch))
8| 1| switch (ch) {
9| 0| SW('0', -1);
10| 0| SW('1', 2);
11| 0| SW('2', 3);
12| 0| SW('3', 5);
13| 0| SW('4', 7);
14| 0| SW('5', 11);
15| 0| SW('6', 13);
16| 1| SW('7', 17);
17| 0| SW('8', 19);
18| 0| SW('9', 23);
19| 0| SW('a', 29);
20| 1| SW('A', 29);
21| 1| }
22| 0| return -1;
23| 1|}
24| |int main(void)
25| 1|{
26| 1| char input = '7';
27| 1| int result = get_value(input);
28| 1| printf("Value for '%c': %d\n", input, result);
29| | return EXIT_SUCCESS;
30| 1|}
```
the output is:
```
Value for '7': 17
```
Obviously, only line16, which corresponding to input ‘7’, was executed. Line 20 was wrongly marked as executed.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysV1GPmzgQ_jXOywhkGwjwkIc02ZwqterD9nr3VhkwxFdjR7ZJdv_9yQSyyYYS9a4REov9zczn8Xi-NbNWNIrzFUo-oGS7YJ3ba7PKrA0KrQ-LQlevKymPLRy5sUIrFK0RXpeSqWYcAkpCHOJGOEA02zt3sB5Fd4juGuH2XRGWukV05_0Mr-Bg9D-8dKG3ylLKWZmyGuMEZyTCS1qwguXLJS14kRGcR8WySBJEc4TXX5lpuEPRGl6y5fdlHHTqh9InFUihupegUZ0H7Q1nFbS64tJDD9qKF4TXH5V1TEpebYXx44jujNYO0Z3VtTsxw0eChkvOLLfjN05xjOiuEArh9U53qoKSqUpUzHH4Y7MBcXbN3DlL3nVnjTcXhc9EWSK6Gyi_UaU7Qn63Q4rw-plLXjpe_X9PmwuptpNOeJNoDSGKPqAYt8v4OthPEf5Z4vNT-g8aCVXKruKAoo11ldDhHkVPd1Olez3w6SnrKimKq7mK10JxeP4L0UwhuoES0RxKZjn0yzbcdUb5IhXK-WKiWXmuKaEcNNx9PzLZcT-8ZwbK_XkSpR8QXgMAiLo3tkyqru1hvZd8mPY_exKu3MM4CW_G46-nh2iKEU09yYB4D9HPYGSA0VkUHVDRLCoaUMksKh5Q6SwqGVBknv5yhM0zS0fYfNBshOWzsHzM2XxQNsLmva1_DkPpdvgaaisgZ8B5wpdVy4RCNDtqUb0vp77KhDp0DlC0hTENlwje3HDbyfP8dYH2Vjd0DkYoV_eM6TePglob6KknZe_Wn_ukQslGIUr9ggYnmyHIjbthPU9_f_z6_fnPzebp-fl6ZZfDjPDax3F7DgejG8NaYIU-cu_2xKHRrp-rtZT6JFQDpT5ywxoOhh-0cVAb3ULfYUt9hHetoj_XO0TfNCewrkLRtqQvEMgWgnr0F7TscPABgvpgdC0kD3zbM0HDFTe-fTluXeibT4jojoW6cwivRzGqK-YYtNw0HCpes0660A8bdgII9M2Yh56TceFt9_oEQeBfvoPyoNSdchYGDgMjFG3f-4ELGUDR08AxlKU-9mvvl9_nxG8KQenmUnmbmR7qEXQGfNNVPSKa93zVZz0kvqDJGf3fO693ktwEn-3FHrO8jX45TunNODzu19mdAcx28PyCwld4eNjTCX5oONnlCXloN9n3CX1oN6kEJHpoN6kNJH5oN60WJHloOK0fZDm5dfBQUUj6MOK0xpDsoeG06pDHVTOtQxQ_XOO0MlEyaXjRKnpfHu_Uy4Oid6dsNI7vDuudwnlYMn1I6f3GPVBBOnGsf0EX6f0h_71KSfObhMCcdvpGiyfy-vZcCx9ee-XUnfOpEfZ887pG3JBPB-YkfYf6UhyF7qx89fy1kq8AXqHIspfovSj3UGpjuD1oVXkBdXrcjieKMozyLB3_ynsbZoG_8LJzvArhk2_8FPejJ6NVI1-hZeYHr-Aah_B6Ua2iKo9ytuArkiYRzqIcZ4v9apmXRcaqKC0KmsaExxXLCatzzpKIRglbiBXFNMEpJTiNE5yFhFc0Y3lN4zqjjGcoxrxlQoZekENtmoWwtuMrEudpSheSFVza_o5LqeIn6Gf93ibbhenvt0HRNRbFWArr7JsbJ5zsL8efPn37HGy-fEPJFj6z0miwjjnecq_yJessB6H6PJbu7X8cvzdnPQl6MXyzWXRGrn7trozoruftr6TDwo4r-m8AAAD__-IaHGY">