Issue |
140427
|
Summary |
[coverage] `return` in macros leads to incorrect coverage mapping after its invocation
|
Labels |
clang:codegen,
coverage
|
Assignees |
|
Reporter |
whentojump
|
Compiler explorer [link](https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1DIApACYAQuYukl9ZATwDKjdAGFUtAK4sGe1wAyeAyYAHI%2BAEaYxCAAzFykAA6oCoRODB7evnrJqY4CQSHhLFEx8baY9vkMQgRMxASZPn4JdpgO6bX1BIVhkdFxrXUNTdlD3b3FpYMAlLaoXsTI7BzmscHI3lgA1CaxbgoE%2BKgAdAh72CYaAIJX1wD099sQXDO7ZmbEmASLDOZm22C2xYTGQxFQdzWWBoIW2ADEAPII3YAVjcd22mMBVGeETeJjRGKxxK%2BP2If1iVhud2CBG2wFI22Qgj2VNuNwAbqg8OhtvxUBBadsmIyhXjdgB2NnE9CoSUWbaPZ5mN7BVI7QzvMx4Kj/Rn/ADuCDomH%2B22%2BphuxOJOueTBmROt1tJv1ZiqeEFi%2BI%2BLvJeq1wFQRDNFsd1qVwGsUcp7sBDCUDWCwGF20OTAImDYgm2CGimHNtDwLGC6cwCm2BFzwoiDBIINo2yiCCYHKcxDDxMRCNZHaxzIIUcsbqVe3RsQAItsDeCjNtC7C0BzokxgPmwyYJZOjSbnhoHZTIZvITchSDghAuTz8VKw/xiM8hXhdhPtho3U/R9suG%2BY3hBxYHStJ0%2BVQAUNEZPceyAzE7wfbMPxfH8FQQtxtjMDQkMBf9AOuYCQIFBJX33aUsVgwV4OfSdMJQ7ZYgw6jsN7GDQIgcCv2I28SDgukEKo99n1QyR6IYodLBwvD%2BReRlXig3CsUSYhaSoCB/n7Sj3hRdACTcP4PkZfsOOpI8bg4OZaE4FFeD8DgtFIVBOHRUSFQUBYljXMx4l4AhNFMuYAGsQBRcDzI4SQrJ8uzOF4BQQHA7ybNM0g4FgGBEBQVAWESE0yAoCA0Ey7KUAMIwAH0mAUBNqgUEqCGILwGD8vg6AzYgYogCIIoiEtiAAT04HhSC65heoRCJtHaeKBvyrMCARBhaD6hLSCwCIvGANwxFoGLuF4LAQSMcQlvwL4OiXbbbMwVR2i8DMItpSoIsLCJiHqHqPCwCLaqLfreCXYgIhSTBx0zQxgHnUAErmKgDGABQADU8EwA0EUSRgfpkQQRDEdgpAx%2BQlDUCLdASYrjH/fQ8AiGLIDmVBEiqzgAFoqAU1AaHoRm1VqxnVxCF6M22ZnF2XVdGZBRIsqMXhUD%2BxSsGpiA5jaDpnAgVxRhaUhAmCPoSgGBJcjSAQNZyFIjYYSZ%2BhiVpKgmzphkaTxmj0ZXqi6BpLb163bAdk3xg9nWpn1pXXOWCQzIs8KlvsjhtlUAAOAA2RnE8kJlSbtCroiqis6oat4IFwQguLWV4vJ8mY5lzJgsBiRXSACoL9E4MLSBYQYTjoujE9iJOuHQ2JpGs2yY%2Bi2LSHirQ5mStKFgIRIbvISh8qy%2BhiFCVgVgT5PU/T0HM8q9Jy1q%2Bq/JmXhMHwIg5b0fhMdEcRcbv/GVHUJbidIacmESH6I44SzSDD2lpwBEN0F50jZnHJOKc06bH3hAcqh8BDHzzmfZ4HgCpr3ePEc%2BE8K5V0wDXAY9cQqt3brEFEnce6Jw0GYeOGgUSSB7mYCUgCIqj1sOPSeiUZ4QCQEQTwS8EHEFhlFUg9RYbKEMJUIQCBUAGmslNDKq9ogbzYJwbeMC96zgQVnRMyDc6n1wZfYuN8EjPyxo/aQz9FCvyJnoFgAhQSoCLtfAAEuVCwmBGDXBuqgFGjBL7o0ccwNAriSABMUbwEJzjaj4CiT7eJYjDjxKkSEWgsj5EJIEbQAAkugEAtBaAchYIzRcJ8Gqfxej/Haf8AFAMihwIpJSyky2eHAowjMBALTeJo3eHTky6KQfGQx%2BdnjhPvKXRkGCVGTI8mXPBkM/5kLiLETusQNmbK2Zsth0dklcPwQ3QKwVOCxCjiPMR3DK7Nw4GYc5wCODlyWaQP6qRnCSCAA%3D%3D%3D)
Problematic input:
```c
// (1) "return" in macro
#define FOO \
if (b) \
return;
int g, cnt;
void foo(int a, int b) {
do { // (2) inside an "if", "while" etc
if (a)
return; // (3) "return", "goto" etc
// g++; // inserting a statement here eliminates the abnormal behavior
FOO;
cnt++; // <= wrong line coverage
} while (0);
}
```
Report:
```c
10| 43.2k|void foo(int a, int b) {
11| 43.2k| do { // (2) inside an "if", "while" etc
12| 43.2k| if (a)
13| 40.2k| return; // (3) "return", "goto" etc
14| | // g++; // inserting a statement here eliminates the abnormal behavior
15| 3.02k| FOO;
16| 3.02k| cnt++; // <= wrong line coverage
17| 3.02k| } while (0);
18| 43.2k|}
```
Line coverage for line 16 is "3.02k" but printing the value of `cnt` at the end of the program it instead says "10".
Real-world example: https://sources.debian.org/src/lzma/9.22-2.2/C/LzmaDec.c/#L628
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs