1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
LL| |#![feature(c_unwind)]
LL| |#![allow(unused_assignments)]
LL| |
LL| 12|extern "C" fn might_abort(should_abort: bool) {
LL| 12| if should_abort {
LL| 0| println!("aborting...");
LL| 0| panic!("panics and aborts");
LL| 12| } else {
LL| 12| println!("Don't Panic");
LL| 12| }
LL| 12|}
LL| |
LL| 1|fn main() -> Result<(), u8> {
LL| 1| let mut countdown = 10;
LL| 11| while countdown > 0 {
LL| 10| if countdown < 5 {
LL| 4| might_abort(false);
LL| 6| }
LL| | // See discussion (below the `Notes` section) on coverage results for the closing brace.
LL| 10| if countdown < 5 { might_abort(false); } // Counts for different regions on one line.
^4 ^6
LL| | // For the following example, the closing brace is the last character on the line.
LL| | // This shows the character after the closing brace is highlighted, even if that next
LL| | // character is a newline.
LL| 10| if countdown < 5 { might_abort(false); }
^4 ^6
LL| 10| countdown -= 1;
LL| | }
LL| 1| Ok(())
LL| 1|}
LL| |
LL| |// Notes:
LL| |// 1. Compare this program and its coverage results to those of the similar tests
LL| |// `panic_unwind.rs` and `try_error_result.rs`.
LL| |// 2. This test confirms the coverage generated when a program includes `UnwindAction::Terminate`.
LL| |// 3. The test does not invoke the abort. By executing to a successful completion, the coverage
LL| |// results show where the program did and did not execute.
LL| |// 4. If the program actually aborted, the coverage counters would not be saved (which "works as
LL| |// intended"). Coverage results would show no executed coverage regions.
LL| |// 6. If `should_abort` is `true` and the program aborts, the program exits with a `132` status
LL| |// (on Linux at least).
LL| |
LL| |/*
LL| |
LL| |Expect the following coverage results:
LL| |
LL| |```text
LL| | 16| 11| while countdown > 0 {
LL| | 17| 10| if countdown < 5 {
LL| | 18| 4| might_abort(false);
LL| | 19| 6| }
LL| |```
LL| |
LL| |This is actually correct.
LL| |
LL| |The condition `countdown < 5` executed 10 times (10 loop iterations).
LL| |
LL| |It evaluated to `true` 4 times, and executed the `might_abort()` call.
LL| |
LL| |It skipped the body of the `might_abort()` call 6 times. If an `if` does not include an explicit
LL| |`else`, the coverage implementation injects a counter, at the character immediately after the `if`s
LL| |closing brace, to count the "implicit" `else`. This is the only way to capture the coverage of the
LL| |non-true condition.
LL| |
LL| |As another example of why this is important, say the condition was `countdown < 50`, which is always
LL| |`true`. In that case, we wouldn't have a test for what happens if `might_abort()` is not called.
LL| |The closing brace would have a count of `0`, highlighting the missed coverage.
LL| |*/
|