diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2019-09-07 11:21:48 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2019-09-07 11:21:48 +0000 |
commit | 668007a2dec842f36eef4b27bb4b18dff3111855 (patch) | |
tree | e1abd44f1287e8a4d14bc87bd154eda3e65805f3 /lib/StaticAnalyzer/Checkers/EnumCastOutOfRangeChecker.cpp | |
parent | 24632cab8a0c7485d3c7b3a77625967ff9c7958f (diff) |
Diffstat (limited to 'lib/StaticAnalyzer/Checkers/EnumCastOutOfRangeChecker.cpp')
-rw-r--r-- | lib/StaticAnalyzer/Checkers/EnumCastOutOfRangeChecker.cpp | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/lib/StaticAnalyzer/Checkers/EnumCastOutOfRangeChecker.cpp b/lib/StaticAnalyzer/Checkers/EnumCastOutOfRangeChecker.cpp index 736d80ef9ec7e..a6539098c89a3 100644 --- a/lib/StaticAnalyzer/Checkers/EnumCastOutOfRangeChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/EnumCastOutOfRangeChecker.cpp @@ -91,6 +91,22 @@ void EnumCastOutOfRangeChecker::reportWarning(CheckerContext &C) const { void EnumCastOutOfRangeChecker::checkPreStmt(const CastExpr *CE, CheckerContext &C) const { + + // Only perform enum range check on casts where such checks are valid. For + // all other cast kinds (where enum range checks are unnecessary or invalid), + // just return immediately. TODO: The set of casts whitelisted for enum + // range checking may be incomplete. Better to add a missing cast kind to + // enable a missing check than to generate false negatives and have to remove + // those later. + switch (CE->getCastKind()) { + case CK_IntegralCast: + break; + + default: + return; + break; + } + // Get the value of the expression to cast. const llvm::Optional<DefinedOrUnknownSVal> ValueToCast = C.getSVal(CE->getSubExpr()).getAs<DefinedOrUnknownSVal>(); |