[PATCH] D129737: [analyzer] Fixing SVal::getType returns Null Type for NonLoc::ConcreteInt in boolean type
Ella Ma via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Jul 14 00:52:01 PDT 2022
OikawaKirie created this revision.
OikawaKirie added reviewers: vsavchenko, NoQ, ASDenysPetrov.
OikawaKirie added a project: clang.
Herald added subscribers: steakhal, manas, martong, dkrupp, donat.nagy, Szelethus, mikhail.ramalho, a.sidorin, szepet, baloghadamsoftware, xazax.hun.
Herald added a project: All.
OikawaKirie requested review of this revision.
Herald added a subscriber: cfe-commits.
In method `TypeRetrievingVisitor::VisitConcreteInt`, `ASTContext::getIntTypeForBitwidth` is used to get the type for `ConcreteInt`s.
However, the getter in ASTContext cannot handle the boolean type with the bit width of 1, which will make method `SVal::getType` return a Null `Type`.
In this patch, a check for this case is added to fix this problem by returning the bool type directly when the bit width is 1.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D129737
Files:
clang/lib/StaticAnalyzer/Core/SVals.cpp
clang/unittests/StaticAnalyzer/SValTest.cpp
Index: clang/unittests/StaticAnalyzer/SValTest.cpp
===================================================================
--- clang/unittests/StaticAnalyzer/SValTest.cpp
+++ clang/unittests/StaticAnalyzer/SValTest.cpp
@@ -161,6 +161,7 @@
void foo() {
int x = 42;
int *y = nullptr;
+ bool z = true;
})") {
SVal X = getByName("x");
ASSERT_FALSE(X.getType(Context).isNull());
@@ -170,6 +171,10 @@
ASSERT_FALSE(Y.getType(Context).isNull());
expectSameSignAndBitWidth(Context.getUIntPtrType(), Y.getType(Context),
Context);
+
+ SVal Z = getByName("z");
+ ASSERT_FALSE(Z.getType(Context).isNull());
+ EXPECT_EQ(Context.BoolTy, Z.getType(Context));
}
SVAL_TEST(GetLocAsIntType, R"(
Index: clang/lib/StaticAnalyzer/Core/SVals.cpp
===================================================================
--- clang/lib/StaticAnalyzer/Core/SVals.cpp
+++ clang/lib/StaticAnalyzer/Core/SVals.cpp
@@ -136,6 +136,8 @@
}
template <class ConcreteInt> QualType VisitConcreteInt(ConcreteInt CI) {
const llvm::APSInt &Value = CI.getValue();
+ if (1 == Value.getBitWidth())
+ return Context.BoolTy;
return Context.getIntTypeForBitwidth(Value.getBitWidth(), Value.isSigned());
}
QualType VisitLocConcreteInt(loc::ConcreteInt CI) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D129737.444536.patch
Type: text/x-patch
Size: 1288 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220714/7dd1a16b/attachment.bin>
More information about the cfe-commits
mailing list