[PATCH] D104616: [analyzer][WIP] Model comparision methods of std::unique_ptr
Valeriy Savchenko via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Jun 22 11:16:58 PDT 2021
vsavchenko added a comment.
Looks like a solid start!
================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:301
+
+ bool addTransition = false;
+ ProgramStateRef State = C.getState();
----------------
nit: variable names should be capitalized
================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:321-323
+ State =
+ State->assume(llvm::dyn_cast<DefinedOrUnknownSVal>(RetVal), true);
+ addTransition = true;
----------------
Another idea here.
Instead of repeating:
```
State = State->assume(llvm::dyn_cast<DefinedOrUnknownSVal>(RetVal), VALUE);
addTransition = true;
```
and having boolean `addTransition`, you can have `Optional<bool> CompResult` and do:
```
CompResult = VALUE;
```
And do the actual assumption at the bottom section when `CompResult.hasValue()`
================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:334
+ default:
+ assert(false && "shouldn't reach here");
+ }
----------------
nit: `llvm_unreachable` instead of `assert(false)`
================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:345-364
+ if (FirstPtr && !SecondPtr &&
+ State->assume(llvm::dyn_cast<DefinedOrUnknownSVal>(*FirstPtr),
+ false)) {
+ // FirstPtr is null, SecondPtr is unknown
+ if (OOK == OO_LessEqual) {
+ State =
+ State->assume(llvm::dyn_cast<DefinedOrUnknownSVal>(RetVal), true);
----------------
These are also symmetrical.
================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:373-391
+ switch (OOK) {
+ case OO_Equal:
+ case OO_GreaterEqual:
+ case OO_LessEqual:
+ State = State->assume(llvm::dyn_cast<DefinedOrUnknownSVal>(RetVal),
+ true);
+ addTransition = true;
----------------
This switch exactly repeats the previous switch.
================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:394-436
+ if (FirstNull && !SecondNull) {
+ switch (OOK) {
+ case OO_Less:
+ case OO_LessEqual:
+ State = State->assume(llvm::dyn_cast<DefinedOrUnknownSVal>(RetVal),
+ true);
+ addTransition = true;
----------------
These are symmetrical, is there a way to implement it without this boilerplate?
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