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

Reply via email to