2024-04-19 02:58:42 +00:00
|
|
|
LL| |#![feature(coverage_attribute)]
|
|
|
|
LL| |//@ edition: 2021
|
2024-06-19 09:49:10 +00:00
|
|
|
LL| |//@ min-llvm-version: 19
|
2024-04-19 02:58:42 +00:00
|
|
|
LL| |//@ compile-flags: -Zcoverage-options=mcdc
|
2024-07-02 06:24:43 +00:00
|
|
|
LL| |//@ llvm-cov-flags: --show-branches=count --show-mcdc
|
2024-04-19 02:58:42 +00:00
|
|
|
LL| |
|
|
|
|
LL| 2|fn mcdc_check_neither(a: bool, b: bool) {
|
|
|
|
LL| 2| if a && b {
|
|
|
|
^0
|
|
|
|
------------------
|
2024-07-02 06:24:43 +00:00
|
|
|
| Branch (LL:8): [True: 0, False: 2]
|
|
|
|
| Branch (LL:13): [True: 0, False: 0]
|
|
|
|
------------------
|
2024-04-19 02:58:42 +00:00
|
|
|
|---> MC/DC Decision Region (LL:8) to (LL:14)
|
|
|
|
|
|
|
|
|
| Number of Conditions: 2
|
|
|
|
| Condition C1 --> (LL:8)
|
|
|
|
| Condition C2 --> (LL:13)
|
|
|
|
|
|
|
|
|
| Executed MC/DC Test Vectors:
|
|
|
|
|
|
|
|
|
| C1, C2 Result
|
|
|
|
| 1 { F, - = F }
|
|
|
|
|
|
|
|
|
| C1-Pair: not covered
|
|
|
|
| C2-Pair: not covered
|
|
|
|
| MC/DC Coverage for Decision: 0.00%
|
|
|
|
|
|
|
|
|
------------------
|
|
|
|
LL| 0| say("a and b");
|
|
|
|
LL| 2| } else {
|
|
|
|
LL| 2| say("not both");
|
|
|
|
LL| 2| }
|
|
|
|
LL| 2|}
|
|
|
|
LL| |
|
|
|
|
LL| 2|fn mcdc_check_a(a: bool, b: bool) {
|
|
|
|
LL| 2| if a && b {
|
|
|
|
^1
|
|
|
|
------------------
|
2024-07-02 06:24:43 +00:00
|
|
|
| Branch (LL:8): [True: 1, False: 1]
|
|
|
|
| Branch (LL:13): [True: 1, False: 0]
|
|
|
|
------------------
|
2024-04-19 02:58:42 +00:00
|
|
|
|---> MC/DC Decision Region (LL:8) to (LL:14)
|
|
|
|
|
|
|
|
|
| Number of Conditions: 2
|
|
|
|
| Condition C1 --> (LL:8)
|
|
|
|
| Condition C2 --> (LL:13)
|
|
|
|
|
|
|
|
|
| Executed MC/DC Test Vectors:
|
|
|
|
|
|
|
|
|
| C1, C2 Result
|
|
|
|
| 1 { F, - = F }
|
|
|
|
| 2 { T, T = T }
|
|
|
|
|
|
|
|
|
| C1-Pair: covered: (1,2)
|
|
|
|
| C2-Pair: not covered
|
|
|
|
| MC/DC Coverage for Decision: 50.00%
|
|
|
|
|
|
|
|
|
------------------
|
|
|
|
LL| 1| say("a and b");
|
|
|
|
LL| 1| } else {
|
|
|
|
LL| 1| say("not both");
|
|
|
|
LL| 1| }
|
|
|
|
LL| 2|}
|
|
|
|
LL| |
|
|
|
|
LL| 2|fn mcdc_check_b(a: bool, b: bool) {
|
|
|
|
LL| 2| if a && b {
|
|
|
|
------------------
|
2024-07-02 06:24:43 +00:00
|
|
|
| Branch (LL:8): [True: 2, False: 0]
|
|
|
|
| Branch (LL:13): [True: 1, False: 1]
|
|
|
|
------------------
|
2024-04-19 02:58:42 +00:00
|
|
|
|---> MC/DC Decision Region (LL:8) to (LL:14)
|
|
|
|
|
|
|
|
|
| Number of Conditions: 2
|
|
|
|
| Condition C1 --> (LL:8)
|
|
|
|
| Condition C2 --> (LL:13)
|
|
|
|
|
|
|
|
|
| Executed MC/DC Test Vectors:
|
|
|
|
|
|
|
|
|
| C1, C2 Result
|
|
|
|
| 1 { T, F = F }
|
|
|
|
| 2 { T, T = T }
|
|
|
|
|
|
|
|
|
| C1-Pair: not covered
|
|
|
|
| C2-Pair: covered: (1,2)
|
|
|
|
| MC/DC Coverage for Decision: 50.00%
|
|
|
|
|
|
|
|
|
------------------
|
|
|
|
LL| 1| say("a and b");
|
|
|
|
LL| 1| } else {
|
|
|
|
LL| 1| say("not both");
|
|
|
|
LL| 1| }
|
|
|
|
LL| 2|}
|
|
|
|
LL| |
|
|
|
|
LL| 3|fn mcdc_check_both(a: bool, b: bool) {
|
|
|
|
LL| 3| if a && b {
|
|
|
|
^2
|
|
|
|
------------------
|
2024-07-02 06:24:43 +00:00
|
|
|
| Branch (LL:8): [True: 2, False: 1]
|
|
|
|
| Branch (LL:13): [True: 1, False: 1]
|
|
|
|
------------------
|
2024-04-19 02:58:42 +00:00
|
|
|
|---> MC/DC Decision Region (LL:8) to (LL:14)
|
|
|
|
|
|
|
|
|
| Number of Conditions: 2
|
|
|
|
| Condition C1 --> (LL:8)
|
|
|
|
| Condition C2 --> (LL:13)
|
|
|
|
|
|
|
|
|
| Executed MC/DC Test Vectors:
|
|
|
|
|
|
|
|
|
| C1, C2 Result
|
|
|
|
| 1 { F, - = F }
|
|
|
|
| 2 { T, F = F }
|
|
|
|
| 3 { T, T = T }
|
|
|
|
|
|
|
|
|
| C1-Pair: covered: (1,3)
|
|
|
|
| C2-Pair: covered: (2,3)
|
|
|
|
| MC/DC Coverage for Decision: 100.00%
|
|
|
|
|
|
|
|
|
------------------
|
|
|
|
LL| 1| say("a and b");
|
|
|
|
LL| 2| } else {
|
|
|
|
LL| 2| say("not both");
|
|
|
|
LL| 2| }
|
|
|
|
LL| 3|}
|
|
|
|
LL| |
|
|
|
|
LL| 4|fn mcdc_check_tree_decision(a: bool, b: bool, c: bool) {
|
|
|
|
LL| 4| // This expression is intentionally written in a way
|
|
|
|
LL| 4| // where 100% branch coverage indicates 100% mcdc coverage.
|
|
|
|
LL| 4| if a && (b || c) {
|
|
|
|
^3 ^2
|
|
|
|
------------------
|
2024-07-02 06:24:43 +00:00
|
|
|
| Branch (LL:8): [True: 3, False: 1]
|
|
|
|
| Branch (LL:14): [True: 1, False: 2]
|
|
|
|
| Branch (LL:19): [True: 1, False: 1]
|
|
|
|
------------------
|
2024-04-19 02:58:42 +00:00
|
|
|
|---> MC/DC Decision Region (LL:8) to (LL:21)
|
|
|
|
|
|
|
|
|
| Number of Conditions: 3
|
|
|
|
| Condition C1 --> (LL:8)
|
|
|
|
| Condition C2 --> (LL:14)
|
|
|
|
| Condition C3 --> (LL:19)
|
|
|
|
|
|
|
|
|
| Executed MC/DC Test Vectors:
|
|
|
|
|
|
|
|
|
| C1, C2, C3 Result
|
|
|
|
| 1 { F, -, - = F }
|
|
|
|
| 2 { T, F, F = F }
|
2024-07-25 07:23:35 +00:00
|
|
|
| 3 { T, F, T = T }
|
|
|
|
| 4 { T, T, - = T }
|
2024-04-19 02:58:42 +00:00
|
|
|
|
|
|
|
|
| C1-Pair: covered: (1,3)
|
2024-07-25 07:23:35 +00:00
|
|
|
| C2-Pair: covered: (2,4)
|
|
|
|
| C3-Pair: covered: (2,3)
|
2024-04-19 02:58:42 +00:00
|
|
|
| MC/DC Coverage for Decision: 100.00%
|
|
|
|
|
|
|
|
|
------------------
|
|
|
|
LL| 2| say("pass");
|
|
|
|
LL| 2| } else {
|
|
|
|
LL| 2| say("reject");
|
|
|
|
LL| 2| }
|
|
|
|
LL| 4|}
|
|
|
|
LL| |
|
|
|
|
LL| 4|fn mcdc_check_not_tree_decision(a: bool, b: bool, c: bool) {
|
|
|
|
LL| 4| // Contradict to `mcdc_check_tree_decision`,
|
2024-07-25 07:23:35 +00:00
|
|
|
LL| 4| // 100% branch coverage of this expression does not indicate 100% mcdc coverage.
|
2024-04-19 02:58:42 +00:00
|
|
|
LL| 4| if (a || b) && c {
|
|
|
|
^1
|
|
|
|
------------------
|
2024-07-02 06:24:43 +00:00
|
|
|
| Branch (LL:9): [True: 3, False: 1]
|
|
|
|
| Branch (LL:14): [True: 1, False: 0]
|
|
|
|
| Branch (LL:20): [True: 2, False: 2]
|
|
|
|
------------------
|
2024-04-19 02:58:42 +00:00
|
|
|
|---> MC/DC Decision Region (LL:8) to (LL:21)
|
|
|
|
|
|
|
|
|
| Number of Conditions: 3
|
|
|
|
| Condition C1 --> (LL:9)
|
|
|
|
| Condition C2 --> (LL:14)
|
|
|
|
| Condition C3 --> (LL:20)
|
|
|
|
|
|
|
|
|
| Executed MC/DC Test Vectors:
|
|
|
|
|
|
|
|
|
| C1, C2, C3 Result
|
|
|
|
| 1 { T, -, F = F }
|
2024-07-25 07:23:35 +00:00
|
|
|
| 2 { F, T, T = T }
|
|
|
|
| 3 { T, -, T = T }
|
2024-04-19 02:58:42 +00:00
|
|
|
|
|
|
|
|
| C1-Pair: not covered
|
|
|
|
| C2-Pair: not covered
|
2024-07-25 07:23:35 +00:00
|
|
|
| C3-Pair: covered: (1,3)
|
2024-04-19 02:58:42 +00:00
|
|
|
| MC/DC Coverage for Decision: 33.33%
|
|
|
|
|
|
|
|
|
------------------
|
|
|
|
LL| 2| say("pass");
|
|
|
|
LL| 2| } else {
|
|
|
|
LL| 2| say("reject");
|
|
|
|
LL| 2| }
|
|
|
|
LL| 4|}
|
|
|
|
LL| |
|
|
|
|
LL| 3|fn mcdc_nested_if(a: bool, b: bool, c: bool) {
|
|
|
|
LL| 3| if a || b {
|
|
|
|
^0
|
|
|
|
------------------
|
2024-07-02 06:24:43 +00:00
|
|
|
| Branch (LL:8): [True: 3, False: 0]
|
|
|
|
| Branch (LL:13): [True: 0, False: 0]
|
|
|
|
------------------
|
2024-04-19 02:58:42 +00:00
|
|
|
|---> MC/DC Decision Region (LL:8) to (LL:14)
|
|
|
|
|
|
|
|
|
| Number of Conditions: 2
|
|
|
|
| Condition C1 --> (LL:8)
|
|
|
|
| Condition C2 --> (LL:13)
|
|
|
|
|
|
|
|
|
| Executed MC/DC Test Vectors:
|
|
|
|
|
|
|
|
|
| C1, C2 Result
|
|
|
|
| 1 { T, - = T }
|
|
|
|
|
|
|
|
|
| C1-Pair: not covered
|
|
|
|
| C2-Pair: not covered
|
|
|
|
| MC/DC Coverage for Decision: 0.00%
|
|
|
|
|
|
|
|
|
------------------
|
|
|
|
LL| 3| say("a or b");
|
|
|
|
LL| 3| if b && c {
|
|
|
|
^2
|
|
|
|
------------------
|
2024-07-02 06:24:43 +00:00
|
|
|
| Branch (LL:12): [True: 2, False: 1]
|
|
|
|
| Branch (LL:17): [True: 1, False: 1]
|
|
|
|
------------------
|
2024-04-19 02:58:42 +00:00
|
|
|
|---> MC/DC Decision Region (LL:12) to (LL:18)
|
|
|
|
|
|
|
|
|
| Number of Conditions: 2
|
|
|
|
| Condition C1 --> (LL:12)
|
|
|
|
| Condition C2 --> (LL:17)
|
|
|
|
|
|
|
|
|
| Executed MC/DC Test Vectors:
|
|
|
|
|
|
|
|
|
| C1, C2 Result
|
|
|
|
| 1 { F, - = F }
|
|
|
|
| 2 { T, F = F }
|
|
|
|
| 3 { T, T = T }
|
|
|
|
|
|
|
|
|
| C1-Pair: covered: (1,3)
|
|
|
|
| C2-Pair: covered: (2,3)
|
|
|
|
| MC/DC Coverage for Decision: 100.00%
|
|
|
|
|
|
|
|
|
------------------
|
|
|
|
LL| 1| say("b and c");
|
|
|
|
LL| 2| }
|
|
|
|
LL| 0| } else {
|
|
|
|
LL| 0| say("neither a nor b");
|
|
|
|
LL| 0| }
|
|
|
|
LL| 3|}
|
|
|
|
LL| |
|
|
|
|
LL| |#[coverage(off)]
|
|
|
|
LL| |fn main() {
|
|
|
|
LL| | mcdc_check_neither(false, false);
|
|
|
|
LL| | mcdc_check_neither(false, true);
|
|
|
|
LL| |
|
|
|
|
LL| | mcdc_check_a(true, true);
|
|
|
|
LL| | mcdc_check_a(false, true);
|
|
|
|
LL| |
|
|
|
|
LL| | mcdc_check_b(true, true);
|
|
|
|
LL| | mcdc_check_b(true, false);
|
|
|
|
LL| |
|
|
|
|
LL| | mcdc_check_both(false, true);
|
|
|
|
LL| | mcdc_check_both(true, true);
|
|
|
|
LL| | mcdc_check_both(true, false);
|
|
|
|
LL| |
|
|
|
|
LL| | mcdc_check_tree_decision(false, true, true);
|
|
|
|
LL| | mcdc_check_tree_decision(true, true, false);
|
|
|
|
LL| | mcdc_check_tree_decision(true, false, false);
|
|
|
|
LL| | mcdc_check_tree_decision(true, false, true);
|
|
|
|
LL| |
|
|
|
|
LL| | mcdc_check_not_tree_decision(false, true, true);
|
|
|
|
LL| | mcdc_check_not_tree_decision(true, true, false);
|
|
|
|
LL| | mcdc_check_not_tree_decision(true, false, false);
|
|
|
|
LL| | mcdc_check_not_tree_decision(true, false, true);
|
|
|
|
LL| |
|
|
|
|
LL| | mcdc_nested_if(true, false, true);
|
|
|
|
LL| | mcdc_nested_if(true, true, true);
|
|
|
|
LL| | mcdc_nested_if(true, true, false);
|
|
|
|
LL| |}
|
|
|
|
LL| |
|
|
|
|
LL| |#[coverage(off)]
|
|
|
|
LL| |fn say(message: &str) {
|
|
|
|
LL| | core::hint::black_box(message);
|
|
|
|
LL| |}
|
|
|
|
|