xref: /llvm-project/clang-tools-extra/docs/clang-tidy/checks/hicpp/multiway-paths-covered.rst (revision c6fa07ca966eb8902465adbe2c6c1e41a108881c)
1.. title:: clang-tidy - hicpp-multiway-paths-covered
2
3hicpp-multiway-paths-covered
4============================
5
6This check discovers situations where code paths are not fully-covered.
7It furthermore suggests using ``if`` instead of ``switch`` if the code will be more clear.
8The `rule 6.1.2 <https://www.perforce.com/resources/qac/high-integrity-cpp-coding-standard/statements>`_
9and `rule 6.1.4 <https://www.perforce.com/resources/qac/high-integrity-cpp-coding-standard/statements>`_
10of the High Integrity C++ Coding Standard are enforced.
11
12``if-else if`` chains that miss a final ``else`` branch might lead to unexpected
13program execution and be the result of a logical error.
14If the missing ``else`` branch is intended you can leave it empty with a clarifying
15comment.
16This warning can be noisy on some code bases, so it is disabled by default.
17
18.. code-block:: c++
19
20  void f1() {
21    int i = determineTheNumber();
22
23     if(i > 0) {
24       // Some Calculation
25     } else if (i < 0) {
26       // Precondition violated or something else.
27     }
28     // ...
29  }
30
31Similar arguments hold for ``switch`` statements which do not cover all possible code paths.
32
33.. code-block:: c++
34
35  // The missing default branch might be a logical error. It can be kept empty
36  // if there is nothing to do, making it explicit.
37  void f2(int i) {
38    switch (i) {
39    case 0: // something
40      break;
41    case 1: // something else
42      break;
43    }
44    // All other numbers?
45  }
46
47  // Violates this rule as well, but already emits a compiler warning (-Wswitch).
48  enum Color { Red, Green, Blue, Yellow };
49  void f3(enum Color c) {
50    switch (c) {
51    case Red: // We can't drive for now.
52      break;
53    case Green:  // We are allowed to drive.
54      break;
55    }
56    // Other cases missing
57  }
58
59
60The `rule 6.1.4 <https://www.perforce.com/resources/qac/high-integrity-cpp-coding-standard/statements>`_
61requires every ``switch`` statement to have at least two ``case`` labels other than a `default` label.
62Otherwise, the ``switch`` could be better expressed with an ``if`` statement.
63Degenerated ``switch`` statements without any labels are caught as well.
64
65.. code-block:: c++
66
67  // Degenerated switch that could be better written as `if`
68  int i = 42;
69  switch(i) {
70    case 1: // do something here
71    default: // do something else here
72  }
73
74  // Should rather be the following:
75  if (i == 1) {
76    // do something here
77  }
78  else {
79    // do something here
80  }
81
82
83.. code-block:: c++
84
85  // A completely degenerated switch will be diagnosed.
86  int i = 42;
87  switch(i) {}
88
89
90Options
91-------
92
93.. option:: WarnOnMissingElse
94
95  Boolean flag that activates a warning for missing ``else`` branches.
96  Default is `false`.
97