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

Gábor Horváth via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Jun 24 12:13:38 PDT 2021


xazax.hun added inline comments.


================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:301
+  const OverloadedOperatorKind OOK = FD->getOverloadedOperator();
+  if (!(OOK == OO_Equal || OOK == OO_ExclaimEqual || OOK == OO_Less ||
+        OOK == OO_LessEqual || OOK == OO_Greater || OOK == OO_GreaterEqual ||
----------------
So it looks like `operator<<` is the only operator we are not supporting. I think it might be good to include some test code to ensure that its use does not suppress warnings. (Also OK, if you decide to deal with this in a follow-up PR.)


================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:334
+      case OO_LessEqual:
+        State = State->assume((&RetVal)->castAs<DefinedOrUnknownSVal>(), true);
+        break;
----------------
I think in cases where we know that the result is `true` or `false`, the `RetVal` should probably be a constant instead of a conjured symbol with an assumption. 


================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:341
+      case OO_Spaceship:
+        // TODO: What would be a good thing to do here?
+      default:
----------------
Instead of marking this unreachable, I'd suggest to just return a conjured symbol for now.  Usually, we should not use asserts to test user input.


================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:354
+
+      if (FirstPtr && !SecondPtr &&
+          State->assume(FirstPtr->castAs<DefinedOrUnknownSVal>(), false)) {
----------------
I am not sure if we actually need all this special casing. You could create an `SVal` that represents a nullpointer constant and use `evalBinOp` with that `SVal` when there is no symbol available.


================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:394
+        default:
+          llvm_unreachable("cannot reach here");
+        }
----------------
`cannot reach here` is redundant information. That is already encoded in `llvm_unreachable`. I suggest including a message that tells the reader **why** is it unreachable. In this case it could be `"unexpected overloaded operator kind"`.


================
Comment at: clang/test/Analysis/smart-ptr.cpp:466
+
+  clang_analyzer_eval(ptr == ptr); // expected-warning{{TRUE}}
+  clang_analyzer_eval(ptr > ptr);  // expected-warning{{FALSE}}
----------------
Putting tests like this on the same path can be risky. Tests might split the execution path (maybe not now, but in the future). I think it might be more future proof to have a large switch statement that switches on an unknown value and put the tests in separate cases. 


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