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

    <tr>
        <th>Summary</th>
        <td>
            [MC/DC] missing conditions in macros from system headers with cast
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            tools:llvm-cov
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          whentojump
      </td>
    </tr>
</table>

<pre>
    Compiler explorer [link](https://godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:14,fontUsePx:'0',j:1,lang:c%2B%2B,selection:(endColumn:22,endLineNumber:3,positionColumn:22,positionLineNumber:3,selectionStartColumn:22,selectionStartLineNumber:3,startColumn:22,startLineNumber:3),source:'%23ifdef+HEADER%0A%0A%23define+FOO(x)+(+x%5B0%5D+%26%26+x%5B1%5D+)%0A%23define+BAR(x)+(+((int+*)x)%5B0%5D+%26%26+((int+*)x)%5B1%5D+)%0A%0A%23else%0A%0A%23define+HEADER%0A%23include+%3Cexample.cpp%3E%0A%0Aint+buf%5B100%5D%3B%0Aint+a,+b,+c%3B%0A%0Aint+main(void)+%7B%0A++++if+(+FOO(buf)+%26%26+a+%26%26+b+)%0A++++++++return+1%3B%0A++++if+(+BAR(buf)+%26%26+a+%26%26+b+)%0A++++++++return+2%3B%0A++++return+3%3B%0A%7D%0A%23endif'),l:'5',n:'0',o:'C%2B%2B+source+%231',t:'0')),k:33.333333333333336,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:clang_assertions_trunk,filters:(b:'0',binary:'1',binaryObject:'1',commentOnly:'0',debugCalls:'1',demangle:'0',directives:'0',execute:'1',intel:'0',libraryCode:'0',trim:'1',verboseDemangling:'0'),flagsViewOpen:'1',fontScale:14,fontUsePx:'0',j:1,lang:c%2B%2B,libs:!(),options:'-fprofile-instr-generate+-fcoverage-mapping+-fcoverage-mcdc+-isystem.',overrides:!(),selection:(endColumn:1,endLineNumber:1,positionColumn:1,positionLineNumber:1,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:1),l:'5',n:'0',o:'+x86-64+clang+(assertions+trunk)+(Editor+%231)',t:'0')),header:(),k:33.333333333333336,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:tool,i:(args:'-show-mcdc',argsPanelShown:'0',compilerName:'x86-64+clang+(assertions+trunk)',editorid:1,fontScale:14,fontUsePx:'0',j:1,monacoEditorHasBeenAutoOpened:'1',monacoEditorOpen:'1',monacoStdin:'1',stdin:'',stdinPanelShown:'1',toolId:llvm-covtrunk,wrap:'1'),l:'5',n:'0',o:'llvm-cov+(clang-only)+x86-64+clang+(assertions+trunk)+(Editor+%231,+Compiler+%231)',t:'0')),k:33.33333333333333,l:'4',n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4).


test.c 

```c
// (1) macros defined in a system header
#include <test.h>

int buf[100];
int a, b, c;

int main(void) {
    if ( FOO(buf) && a && b )
 return 1;
    if ( BAR(buf) && a && b )
        return 2;
    return 3;
}
```

test.h

```c
#define FOO(x) ( x[0] && x[1] )
#define BAR(x) ( ((int *)x)[0] && ((int *)x)[1] ) // (2) cast
```

Expressions involving `FOO` or `BAR` exhibit different behaviors in terms of MC/DC: different numbers  of conditions are reported

```text
    7| 1|int main(void) {
    8|                   1|    if ( FOO(buf) && a && b )
  -------------------------------
  |---> MC/DC Decision Region (8:10) to (8:28)
  |
  |  Number of Conditions: 4
  |     Condition C1 --> (8:10)
 |     Condition C2 --> (8:10)
  |     Condition C3 --> (8:22)
  | Condition C4 --> (8:27)
  |
  |  Executed MC/DC Test Vectors:
  |
  | C1, C2, C3, C4    Result
  |  1 { F,  -,  -,  -  = F      }
  |
  | C1-Pair: not covered
  |  C2-Pair: not covered
  |  C3-Pair: not covered
 |  C4-Pair: not covered
  |  MC/DC Coverage for Decision: 0.00%
  |
 -------------------------------
    9|                   0|        return 1;
   10|                   1|    if ( BAR(buf) && a && b )
 -------------------------------
  |---> MC/DC Decision Region (10:10) to (10:28)
  |
  |  Number of Conditions: 3
  |     Condition C1 --> (10:10)
  |     Condition C2 --> (10:22)
  |     Condition C3 --> (10:27)
 |
  |  Executed MC/DC Test Vectors:
  |
  |     C1, C2, C3    Result
  | 1 { F,  -,  -  = F      }
  |
  |  C1-Pair: not covered
  |  C2-Pair: not covered
  |  C3-Pair: not covered
  |  MC/DC Coverage for Decision: 0.00%
 |
  -------------------------------
   11|                   0| return 2;
   12|                   1|    return 3;
   13| 1|}
```

Real-world example: https://sources.debian.org/src/hostname/3.23%2Bnmu1/hostname.c/#L312

cc: @evodius96 

</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJy8GF2P4jjy15gXC5Q4hMADDxAa7Ul7O6OZu31dOUkBnklsZDs08-9PZSckgdDTrZ09hAKub5frK-bGiKMEWJN4S-LdhNf2pPT69QTSqm91dZ5kqvixTlV1FiVoCtdzqTRoSuJtKeR3Eu8IW56sPRsSbQjbE7Y_qiJTpZ0pfXSA6OhQIWFLwpbPFycSbXJVwEshrNKEpcJhlwdRguQVuFUSEpYQlh6UtF9zXiI0nDeA_xr4fPVkgSf7hmjC0pJL1JUTFrNt80gNlJBboaTXA7JIVVlXuGSMsBRk8buQ8EddZaBJtIkIS8_KCGQZUrbQB_Kbiq-WaztkGuIeWUc4xghXiFC1zhsH4e4icSjgQNj2t5fN7uULYXGwaR8sKuAgJBC23X_6RNjy6mRs3SFsr4TF8TbA5454Vy2aR4MLO9xqROZ28-Vepj9eIa37vyFs5dFPFb3BMKa9MQFKA892OvQDi4TMy7oArzhK4cqrcwmz_HzG9UsnxhuR1QevPWgNjqNtD88JS5HM_-QdukdTcSEJW16UKFrnxElLtb19xeHmN388Tvfq3kX8HpANfLId_WqwtZaEOS9Gb-r2x_hP6Gbjum_4aOC9ZNc7YFmghYmP-dKHe-wTXQ7SXvlV2k_3bZMkHhA1dcT2-VZe8ndMrGgWDT6LTuX8DZV-gcUwGJGejtc8X1y7ineDRJscK9df3BjQWCrMX1bX8jvWO1Fa0L7qLrOBKZmQXP8YlEsP-pR9g9wOELmqKpD2kyx_DGQUkNXHlJelGZAXUHF5LGFIKzQWsguYARiukNd2WLaFtFAOqEqRaa5_pKoYCrVaVAPWC-hMGdh5C4Q83vv2UPKj-VPA66czyF_eLEqRmd7JoUJ1dkfiZUwPZ62wVU2FNFZPjyBBc4vxNj3k6gKaH2Fa8fMZTR8C8yJHiDA_jIVq1gTUBbQWBdxrfaNrhSNNKxxrWuGznhU-71mPqEfOR4YxukHHCt-dzdiBlovpYo4l1p2RK1ZdbhC2bbKj6T3tJHHL-NXzpD8BL5yBN0f_n8uAVarsSgDXxzawzEm9NjGCQhHzmUsov57U61B5Wzf-uE1LH3CYS1nnMFE0p_fBvKmU5LnyTv-Nmy2A3NRWYTpCMUjIPuVDtnrkV1uIIdx0kB7g3hVtXVeq_BcqLctLNc3Vpa2br5qf-5TvDL5WjHeh8-ZUYdF0sfZ34xKnhvTWBt4TrqPB-Stis-cP9lMhY8wX0MZXpzlhqxkJNv5rwdhZTpv1IvDfHBfutYEStsQ904rnWhnqZ7eCCkk59ZWRNkmKLO0IR0mUOtEnEr144UJaipOLn9fiHYm2DRTnNIpTGs09sIEPZzNKEsRRSqk4oFm0P4lRgjPPgvL2T0Zx48GG-hGGhl50j70_TD1nbz6NFNZJaSBRY3Ky6zuw59zTqG-bIZh2w76z6Upw-o53rRm4Dv16NeDrBnrHd5vNaW8yH4p6QtJKp915M1zm3NjHHb1czxoMRpKhQl5UeRHySMkiwH0sAqo0LtC4RUDhehKZsLQQhwNowPOHE78IpZGZWtCVoepA_50Stt-lJNr0SKVrTYYiQa5k4bqioVwD1XBW2kJx51gLV9ucTUKSlIYkSd8MoyVSPX7CBvyhKKPTtz-OhiQp_o1e2i3THeQCvUm_wBF_CFsusW4HqMyqdu2bXyOi_aXUt2_0UHrzEHpx3pFQ2uFoGlKvvq8GaUdI2RPSMdpoSItvxR1tj25-R5eM7urFT6jFzUn_AWPpn5Bb5Sfre44UazVNmXtG7jlHC7-AqUvbCQ7x7OkeCei0_6SURDu698fvM_lew_QzFziHUKksdTOii79Gcsp-go-e4T16_jZ764i0mU3pQelb6CBXMHOvwH273xOPlK7GUyDogR_qZxi8K2_eV15_WdqEwV3eOMAHEyd6R-J0ip4RszviYT48zx1PnHQ5-TdywmkZ5MVIRowkxE9T4R_MhY8He2vYu4I9DN8I9of-HrK3o3zY_hERtU1ndBb4ArycvipdFrS518K9DO9o_euXmRWQCS6bq1qjc8L2J2Wsu25l-2jGIvf-K6s67KFmub_Y_T0KmdeZ56iDzAO4qELUZrXAQW9SrKNiFa34BNZhMmdhGMXLYHJaJ3BgLJmHBSwWB85YUizy-ZyxQwEZxFkyEWsWsDiIwkWwZAsWzOLFIlkkyZzny2S1nEeoquKinOFgjvZPhDE1rMMojIN4UvIMSuNutRnDdwHTexUgjJF4N9FrB8jqoyHzoBTGmk6aFbZ0t-LtyBDvaCWMwSGkNyQI2Y6rB62q4Zhq6KuwJzfeTGpdru9uyYU91dksVxVhe1Tb_EzPWrlbGrZ3OzKE7ZtNXdbsfwEAAP__XBg-kg">