[PATCH] D103750: [analyzer][WIP] Handle std::make_unique for SmartPtrModeling

Artem Dergachev via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Sun Jun 6 17:33:22 PDT 2021


NoQ added a comment.

Tests pls!

Yes I think you should totally do an `evalCall()` here. The function has no other side effects apart from making a pointer so it's valuable to fully model it so that to avoid unnecessary store invalidations.

In D103750#2801320 <https://reviews.llvm.org/D103750#2801320>, @xazax.hun wrote:

>> Since we have CallExpr, we can easily conjure up an SVal. But I don't see how I can do it similarly in this patch.
>
> You should have a `CallExpr` for `std::make_unique` too. I believe that expression is used to determine how the conjured symbol was created (to give it an identity). So probably it should be ok to use the `make_unique` call to create this symbol (but be careful to create the symbol with the right type).

That's right, a conjured symbol isn't necessarily the value of its respective expression. So you can conjure it and assume that it's non-null. Also consider using a //heap// conjured symbol (a-la `getConjuredHeapSymbolVal()`). That said, `getConjuredHeapSymbolVal()` doesn't provide an overload for overriding the type; there's no reason it shouldn't though, please feel free to extend it.

There's a separate story about `SymbolConjured` being the right class for the problem. I'm still in favor of having `SymbolMetadata` instead, so that to properly deduplicate symbols across different branches and merge more paths.



================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:204
+MakeUniqueKind
+SmartPtrModeling::isStdMakeUniqueCall(const CallEvent &Call) const {
+  if (Call.getKind() != CallEventKind::CE_Function)
----------------
Please use `CallDescription` for most of this stuff.


================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:337
+
+bool isUniquePtrType(QualType QT) {
+  const auto *T = QT.getTypePtr();
----------------
Please merge with `isStdSmartPtrCall`.


================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:338-341
+  const auto *T = QT.getTypePtr();
+  if (!T)
+    return false;
+  const auto *Decl = T->getAsCXXRecordDecl();
----------------
`getTypePtr()` is almost never necessary because `QualType` has an overloaded `operator->()`.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D103750/new/

https://reviews.llvm.org/D103750



More information about the cfe-commits mailing list