forked from OSchip/llvm-project
97 lines
2.8 KiB
ReStructuredText
97 lines
2.8 KiB
ReStructuredText
.. title:: clang-tidy - hicpp-multiway-paths-covered
|
|
|
|
hicpp-multiway-paths-covered
|
|
============================
|
|
|
|
This check discovers situations where code paths are not fully-covered.
|
|
It furthermore suggests using ``if`` instead of ``switch`` if the code will be more clear.
|
|
The `rule 6.1.2 <http://www.codingstandard.com/rule/6-1-2-explicitly-cover-all-paths-through-multi-way-selection-statements/>`_
|
|
and `rule 6.1.4 <http://www.codingstandard.com/rule/6-1-4-ensure-that-a-switch-statement-has-at-least-two-case-labels-distinct-from-the-default-label/>`_
|
|
of the High Integrity C++ Coding Standard are enforced.
|
|
|
|
``if-else if`` chains that miss a final ``else`` branch might lead to unexpected
|
|
program execution and be the result of a logical error.
|
|
If the missing ``else`` branch is intended you can leave it empty with a clarifying
|
|
comment.
|
|
This warning can be noisy on some code bases, so it is disabled by default.
|
|
|
|
.. code-block:: c++
|
|
|
|
void f1() {
|
|
int i = determineTheNumber();
|
|
|
|
if(i > 0) {
|
|
// Some Calculation
|
|
} else if (i < 0) {
|
|
// Precondition violated or something else.
|
|
}
|
|
// ...
|
|
}
|
|
|
|
Similar arguments hold for ``switch`` statements which do not cover all possible code paths.
|
|
|
|
.. code-block:: c++
|
|
|
|
// The missing default branch might be a logical error. It can be kept empty
|
|
// if there is nothing to do, making it explicit.
|
|
void f2(int i) {
|
|
switch (i) {
|
|
case 0: // something
|
|
break;
|
|
case 1: // something else
|
|
break;
|
|
}
|
|
// All other numbers?
|
|
}
|
|
|
|
// Violates this rule as well, but already emits a compiler warning (-Wswitch).
|
|
enum Color { Red, Green, Blue, Yellow };
|
|
void f3(enum Color c) {
|
|
switch (c) {
|
|
case Red: // We can't drive for now.
|
|
break;
|
|
case Green: // We are allowed to drive.
|
|
break;
|
|
}
|
|
// Other cases missing
|
|
}
|
|
|
|
|
|
The `rule 6.1.4 <http://www.codingstandard.com/rule/6-1-4-ensure-that-a-switch-statement-has-at-least-two-case-labels-distinct-from-the-default-label/>`_
|
|
requires every ``switch`` statement to have at least two ``case`` labels other than a `default` label.
|
|
Otherwise, the ``switch`` could be better expressed with an ``if`` statement.
|
|
Degenerated ``switch`` statements without any labels are caught as well.
|
|
|
|
.. code-block:: c++
|
|
|
|
// Degenerated switch that could be better written as `if`
|
|
int i = 42;
|
|
switch(i) {
|
|
case 1: // do something here
|
|
default: // do somethe else here
|
|
}
|
|
|
|
// Should rather be the following:
|
|
if (i == 1) {
|
|
// do something here
|
|
}
|
|
else {
|
|
// do something here
|
|
}
|
|
|
|
|
|
.. code-block:: c++
|
|
|
|
// A completly degenerated switch will be diagnosed.
|
|
int i = 42;
|
|
switch(i) {}
|
|
|
|
|
|
Options
|
|
-------
|
|
|
|
.. option:: WarnOnMissingElse
|
|
|
|
Boolean flag that activates a warning for missing ``else`` branches.
|
|
Default is `0`.
|