diff options
| author | Jonas Toth <jonas.toth@gmail.com> | 2017-11-18 19:48:33 +0000 |
|---|---|---|
| committer | Jonas Toth <jonas.toth@gmail.com> | 2017-11-18 19:48:33 +0000 |
| commit | 9b1dc4c2756dc25f38caa0cf6e6b71d70295b2d1 (patch) | |
| tree | aded95ae12af65a8e91b46edfcf0b75091865142 /clang-tools-extra/test/clang-tidy/hicpp-multiway-paths-covered-else.cpp | |
| parent | 41fc45c4e656a9f35b20e59a2fdf86168f9b2658 (diff) | |
| download | bcm5719-llvm-9b1dc4c2756dc25f38caa0cf6e6b71d70295b2d1.tar.gz bcm5719-llvm-9b1dc4c2756dc25f38caa0cf6e6b71d70295b2d1.zip | |
[clang-tidy] Add new hicpp-multiway-paths-covered check for missing branches
Summary:
This check searches for missing `else` branches in `if-else if`-chains and
missing `default` labels in `switch` statements, that use integers as condition.
It is very similar to -Wswitch, but concentrates on integers only, since enums are
already covered.
The option to warn for missing `else` branches is deactivated by default, since it is
very noise on larger code bases.
Running it on LLVM:
{F5354858} for default configuration
{F5354866} just for llvm/lib/Analysis/ScalarEvolution.cpp, the else-path checker is very noisy!
Reviewers: alexfh, aaron.ballman, hokein
Reviewed By: aaron.ballman
Subscribers: lebedev.ri, Eugene.Zelenko, cfe-commits, mgorny, JDevlieghere, xazax.hun
Tags: #clang-tools-extra
Differential Revision: https://reviews.llvm.org/D37808
llvm-svn: 318600
Diffstat (limited to 'clang-tools-extra/test/clang-tidy/hicpp-multiway-paths-covered-else.cpp')
| -rw-r--r-- | clang-tools-extra/test/clang-tidy/hicpp-multiway-paths-covered-else.cpp | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/clang-tools-extra/test/clang-tidy/hicpp-multiway-paths-covered-else.cpp b/clang-tools-extra/test/clang-tidy/hicpp-multiway-paths-covered-else.cpp new file mode 100644 index 00000000000..34820b5fcc0 --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/hicpp-multiway-paths-covered-else.cpp @@ -0,0 +1,57 @@ +// RUN: %check_clang_tidy %s hicpp-multiway-paths-covered %t \ +// RUN: -config='{CheckOptions: \ +// RUN: [{key: hicpp-multiway-paths-covered.WarnOnMissingElse, value: 1}]}'\ +// RUN: -- + +enum OS { Mac, + Windows, + Linux }; + +void problematic_if(int i, enum OS os) { + if (i > 0) { + return; + } else if (i < 0) { + // CHECK-MESSAGES: [[@LINE-1]]:10: warning: potentially uncovered codepath; add an ending else statement + return; + } + + // Could be considered as false positive because all paths are covered logically. + // I still think this is valid since the possibility of a final 'everything else' + // codepath is expected from if-else if. + if (i > 0) { + return; + } else if (i <= 0) { + // CHECK-MESSAGES: [[@LINE-1]]:10: warning: potentially uncovered codepath; add an ending else statement + return; + } + + // Test if nesting of if-else chains does get caught as well. + if (os == Mac) { + return; + } else if (os == Linux) { + // These checks are kind of degenerated, but the check will not try to solve + // if logically all paths are covered, which is more the area of the static analyzer. + if (true) { + return; + } else if (false) { + // CHECK-MESSAGES: [[@LINE-1]]:12: warning: potentially uncovered codepath; add an ending else statement + return; + } + return; + } else { + /* unreachable */ + if (true) // check if the parent would match here as well + return; + // No warning for simple if statements, since it is common to just test one condition + // and ignore the opposite. + } + + // Ok, because all paths are covered + if (i > 0) { + return; + } else if (i < 0) { + return; + } else { + /* error, maybe precondition failed */ + } +} |

