r285000 - [analyzer] Use unsigned integers to rely on well-defined overflow semantics.
Artem Dergachev via cfe-commits
cfe-commits at lists.llvm.org
Mon Oct 24 11:49:05 PDT 2016
Author: dergachev
Date: Mon Oct 24 13:49:04 2016
New Revision: 285000
URL: http://llvm.org/viewvc/llvm-project?rev=285000&view=rev
Log:
[analyzer] Use unsigned integers to rely on well-defined overflow semantics.
Found by the UBSan buildbot.
Modified:
cfe/trunk/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp
Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp?rev=285000&r1=284999&r2=285000&view=diff
==============================================================================
--- cfe/trunk/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp (original)
+++ cfe/trunk/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp Mon Oct 24 13:49:04 2016
@@ -83,7 +83,7 @@ class StdLibraryFunctionsChecker : publi
/// a non-negative integer, which less than 5 and not equal to 2. For
/// `ComparesToArgument', holds information about how exactly to compare to
/// the argument.
- typedef std::vector<std::pair<int64_t, int64_t>> IntRangeVectorTy;
+ typedef std::vector<std::pair<uint64_t, uint64_t>> IntRangeVectorTy;
/// A reference to an argument or return value by its number.
/// ArgNo in CallExpr and CallEvent is defined as Unsigned, but
@@ -274,7 +274,7 @@ StdLibraryFunctionsChecker::ValueRange::
const llvm::APSInt &MinusInf = BVF.getMinValue(T);
const llvm::APSInt &PlusInf = BVF.getMaxValue(T);
- const llvm::APSInt &Left = BVF.getValue(R[0].first - 1, T);
+ const llvm::APSInt &Left = BVF.getValue(R[0].first - 1ULL, T);
if (Left != PlusInf) {
assert(MinusInf <= Left);
State = CM.assumeWithinInclusiveRange(State, *N, MinusInf, Left, false);
@@ -282,7 +282,7 @@ StdLibraryFunctionsChecker::ValueRange::
return nullptr;
}
- const llvm::APSInt &Right = BVF.getValue(R[E - 1].second + 1, T);
+ const llvm::APSInt &Right = BVF.getValue(R[E - 1].second + 1ULL, T);
if (Right != MinusInf) {
assert(Right <= PlusInf);
State = CM.assumeWithinInclusiveRange(State, *N, Right, PlusInf, false);
@@ -291,8 +291,8 @@ StdLibraryFunctionsChecker::ValueRange::
}
for (size_t I = 1; I != E; ++I) {
- const llvm::APSInt &Min = BVF.getValue(R[I - 1].second + 1, T);
- const llvm::APSInt &Max = BVF.getValue(R[I].first - 1, T);
+ const llvm::APSInt &Min = BVF.getValue(R[I - 1].second + 1ULL, T);
+ const llvm::APSInt &Max = BVF.getValue(R[I].first - 1ULL, T);
assert(Min <= Max);
State = CM.assumeWithinInclusiveRange(State, *N, Min, Max, false);
if (!State)
More information about the cfe-commits
mailing list