diff options
author | Ted Kremenek <kremenek@apple.com> | 2012-11-29 00:50:20 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2012-11-29 00:50:20 +0000 |
commit | 2317f30f4d7250a718d2b7e50bb201b4e59ad255 (patch) | |
tree | d64816addf3a73cc2377a54d1830e38a6d0c9fc0 /clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp | |
parent | 9ae53f8e3a46de8fc32d102569ab0a191d435077 (diff) | |
download | bcm5719-llvm-2317f30f4d7250a718d2b7e50bb201b4e59ad255.tar.gz bcm5719-llvm-2317f30f4d7250a718d2b7e50bb201b4e59ad255.zip |
Correctly handle IntegralToBool casts in C++ in the static analyzer. Fixes <rdar://problem/12759044>.
llvm-svn: 168843
Diffstat (limited to 'clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp')
-rw-r--r-- | clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp b/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp index fbc6ba05510..12da82e3f0c 100644 --- a/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp +++ b/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp @@ -101,6 +101,12 @@ SVal SimpleSValBuilder::evalCastFromNonLoc(NonLoc val, QualType castTy) { if (!isa<nonloc::ConcreteInt>(val)) return UnknownVal(); + // Handle casts to a boolean type. + if (castTy->isBooleanType()) { + bool b = cast<nonloc::ConcreteInt>(val).getValue().getBoolValue(); + return makeTruthVal(b, castTy); + } + // Only handle casts from integers to integers - if val is an integer constant // being cast to a non integer type, produce unknown. if (!isLocType && !castTy->isIntegerType()) @@ -735,7 +741,7 @@ SVal SimpleSValBuilder::evalBinOpLL(ProgramStateRef state, NonLoc *LeftIndex = dyn_cast<NonLoc>(&LeftIndexVal); if (!LeftIndex) return UnknownVal(); - LeftIndexVal = evalCastFromNonLoc(*LeftIndex, resultTy); + LeftIndexVal = evalCastFromNonLoc(*LeftIndex, ArrayIndexTy); LeftIndex = dyn_cast<NonLoc>(&LeftIndexVal); if (!LeftIndex) return UnknownVal(); @@ -745,7 +751,7 @@ SVal SimpleSValBuilder::evalBinOpLL(ProgramStateRef state, NonLoc *RightIndex = dyn_cast<NonLoc>(&RightIndexVal); if (!RightIndex) return UnknownVal(); - RightIndexVal = evalCastFromNonLoc(*RightIndex, resultTy); + RightIndexVal = evalCastFromNonLoc(*RightIndex, ArrayIndexTy); RightIndex = dyn_cast<NonLoc>(&RightIndexVal); if (!RightIndex) return UnknownVal(); |