[PATCH] D66014: [analyzer] Avoid unnecessary enum range check on LValueToRValue casts
Artem Dergachev via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Sun Aug 11 20:13:58 PDT 2019
NoQ added inline comments.
================
Comment at: clang/lib/StaticAnalyzer/Checkers/EnumCastOutOfRangeChecker.cpp:94-98
+ // If cast is implicit LValueToRValue, no conversion is taking place,
+ // and therefore no range check is needed. Don't analyze further.
+ if (CE->getCastKind() == CK_LValueToRValue)
+ return;
+
----------------
If you look at the list of cast kinds, you'll be shocked to see ridiculously weird cornercases. Even though lvalue-to-rvalue cast definitely stands out (because it's the only one that has very little to do with actual casting), i'd still be much more comfortable if we *whitelist* the casts that we check, rather than blacklist them.
Can you take a look at the list and find which casts are we actually talking about and hardcode them here?
================
Comment at: clang/test/Analysis/enum-cast-out-of-range.c:27-34
+enum unscoped_unspecified_t unused;
+void unusedExpr() {
+ // following line is not something that EnumCastOutOfRangeChecker should evaluate. checker should either ignore this line
+ // or process it without producing any warnings. However, compilation will (and should) still generate a warning having
+ // nothing to do with this checker.
+ unused; // expected-warning {{expression result unused}}
+}
----------------
I guess this covers D33672#1537287!
That said, there's one thing about this test that i don't understand. Why does this AST contain an implicit lvalue-to-rvalue cast at all? This looks like a (most likely otherwise harmless) bug in the AST; if i understand correctly, this should be a freestanding `DeclRefExpr`.
Repository:
rC Clang
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D66014/new/
https://reviews.llvm.org/D66014
More information about the cfe-commits
mailing list