[PATCH] D104616: [analyzer] Model comparision methods of std::unique_ptr

Gábor Horváth via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Jul 2 08:26:26 PDT 2021


xazax.hun added inline comments.


================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:408
+  auto makeSValFor = [&C, &State, this](const Expr *E, SVal S) -> SVal {
+    if (S.isZeroConstant()) {
+      return C.getSValBuilder().makeZeroVal(E->getType());
----------------
Do we want to create a new SVal in this case? Why returning `S` is insufficient?


================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:416
+    QualType Type = getInnerPointerType(C, E->getType()->getAsCXXRecordDecl());
+    std::tie(Val, State) = retrieveOrConjureInnerPtrVal(Reg, E, Type, C);
+    return Val;
----------------
While this is smart (overwriting the state here), I think this is hard to follow. I'd prefer this lambda returning a pair.


================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:435
+    ProgramStateRef TrueState, FalseState;
+    std::tie(TrueState, FalseState) =
+        State->assume(*RetVal.getAs<DefinedOrUnknownSVal>());
----------------
`assume` might not return a state (when the analyzer is smart enough to figure out one path is infeasible). While your code would probably work as is, as far as I remember we usually try to not call addTransition with `null` states. 


================
Comment at: clang/test/Analysis/smart-ptr.cpp:484
+  clang_analyzer_eval(nullPtr != nullptr);    // expected-warning{{FALSE}}
+  clang_analyzer_eval(nullptr <= unknownPtr); // expected-warning{{TRUE}}
+}
----------------
I do not see test cases where the path is actually split. Would you add some?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D104616



More information about the cfe-commits mailing list