Open
Description
Compiler explorer link.
test.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
#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
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