summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/test/clang-tidy/hicpp-multiway-paths-covered-else.cpp
diff options
context:
space:
mode:
authorJonas Toth <jonas.toth@gmail.com>2017-11-18 19:48:33 +0000
committerJonas Toth <jonas.toth@gmail.com>2017-11-18 19:48:33 +0000
commit9b1dc4c2756dc25f38caa0cf6e6b71d70295b2d1 (patch)
treeaded95ae12af65a8e91b46edfcf0b75091865142 /clang-tools-extra/test/clang-tidy/hicpp-multiway-paths-covered-else.cpp
parent41fc45c4e656a9f35b20e59a2fdf86168f9b2658 (diff)
downloadbcm5719-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.cpp57
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 */
+ }
+}
OpenPOWER on IntegriCloud