[PATCH] D119601: [analyzer] Refactor makeNull to makeNullWithWidth (NFC)
Balázs Benics via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Feb 18 03:39:56 PST 2022
steakhal added inline comments.
================
Comment at: clang/include/clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h:368
Loc makeNullWithType(QualType type) {
- return loc::ConcreteInt(BasicVals.getZeroWithTypeSize(type));
- }
-
- Loc makeNull() {
- return loc::ConcreteInt(BasicVals.getZeroWithPtrWidth());
+ assert((type->isPointerType() || type->isObjCObjectPointerType() ||
+ type->isBlockPointerType() || type->isNullPtrType() ||
----------------
Add a comment that `isAnyPointerType()` won't work here.
================
Comment at: clang/include/clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h:371
+ type->isReferenceType()) &&
+ "makeNullWithType must use pointer type");
+ QualType nullType = type;
----------------
But you also let reference types.
================
Comment at: clang/include/clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h:372
- Loc makeNull() {
- return loc::ConcreteInt(BasicVals.getZeroWithPtrWidth());
}
----------------
steakhal wrote:
>
You should also remove the `BasicValueFactor::getZeroWithPtrWidth()` along with `BasicValueFactor::getIntWithPtrWidth()` since those suffer from the same issue.
Feel free to do that in a separate patch.
================
Comment at: clang/include/clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h:372-376
+ QualType nullType = type;
+ if (type->isReferenceType()) {
+ nullType = Context.getPointerType(type->getPointeeType());
+ }
+ return loc::ConcreteInt(BasicVals.getZeroWithTypeSize(nullType));
----------------
================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:123
+static QualType getTemplateSpecializationArgType(CheckerContext &C,
+ const CallEvent &Call,
----------------
You don't need the whole `CheckerContext`. Pass the `ASTContext` instead.
I would also recommend using `Idx` instead of `ndx`
================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:133
+ assert(T.getKind() == TemplateArgument::Type);
+ QualType Ty = C.getASTContext().getPointerType(T.getAsType());
+ return Ty;
----------------
You should just return it. Oh wait, you also wrap it inside a pointer. The name of the function does not reflect this. Either rename it or hoist this to the callsite.
================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:402
+ auto NullVal = C.getSValBuilder().makeNullWithType(
+ CC->getCXXThisVal().getType(C.getASTContext()));
State = State->set<TrackedRegionMap>(ThisRegion, NullVal);
----------------
You should use the `CC->getDecl()->getThisType()` instead.
================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:660
+ auto ValueToUpdate =
+ C.getSValBuilder().makeNullWithType(Call.getResultType());
State = State->set<TrackedRegionMap>(ThisRegion, ValueToUpdate);
----------------
Similarly to the previous one, use `getThisType()`.
================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:764
return false;
- auto NullVal = C.getSValBuilder().makeNull();
+ auto NullVal = C.getSValBuilder().makeNullWithType(Call.getResultType());
State = State->set<TrackedRegionMap>(ThisRegion, NullVal);
----------------
Same here.
================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:799
+ auto NullVal = C.getSValBuilder().makeNullWithType(
+ getTemplateSpecializationArgType(C, Call, 0));
State = State->set<TrackedRegionMap>(OtherSmartPtrRegion, NullVal);
----------------
At first glance, all callsites have access to the `getThisType()`, so we shouldn't dig this up from the specialization decl.
================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:885
- auto NullVal = C.getSValBuilder().makeNull();
+ auto NullVal = C.getSValBuilder().makeNullWithType(CallExpr->getType());
// Explicitly tracking the region as null.
----------------
NoQ wrote:
> NoQ wrote:
> > I suspect that this type is going to be `bool` which is probably not what you want.
> I think it makes sense to add an assertion in `makeNullWithType()` to protect against such cases. This will probably also allow you to cover this with a test case.
You probably never want to use `Call.getResultType()` in this file for this context.
Something like this would be more appropriate: `cast<CXXMethodDecl>(Call.getDecl())->getThisType()`
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D119601/new/
https://reviews.llvm.org/D119601
More information about the cfe-commits
mailing list