[PATCH] D75163: [analyzer][StreamChecker] Adding precall and refactoring.
Kristóf Umann via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Feb 28 02:39:55 PST 2020
Szelethus accepted this revision.
Szelethus added a comment.
This revision is now accepted and ready to land.
LGTM! It makes much more sense to do the checking in `preCall` and the modeling in `evalCall`, the comments in the patch are precise and helpful, the tests cover everything. While I feel fairly confident that this patch is great both in concept and in execution, please leave some time for others to respond -- if that doesn't happen in a day or two, I think this is ready to land.
================
Comment at: clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp:64-70
+/// Get the value of the stream argument out of the passed call event.
+/// The call should contain a function that is described by Desc.
+SVal getStreamArg(const FnDescription *Desc, const CallEvent &Call) {
+ assert(Desc && Desc->StreamArgNo != ArgNone &&
+ "Try to get a non-existing stream argument.");
+ return Call.getArgSVal(Desc->StreamArgNo);
+}
----------------
You could make this a method of `FnDescription`.
================
Comment at: clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp:119
+ /// If it can only be NULL a fatal error is emitted and nullptr returned.
+ /// Otherwise a new state where the stream is constrained to be non-null.
+ ProgramStateRef ensureStreamNonNull(SVal StreamVal, CheckerContext &C,
----------------
/// If it can only be NULL a fatal error is emitted and nullptr returned.
/// Otherwise the return value is a new state where the stream is constrained to be non-null.
================
Comment at: clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp:130
+
+ /// Check that the stream is in opened state.
+ /// If the stream is known to be not opened an error is generated
----------------
/// Check that the stream is in an opened state.
================
Comment at: clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp:148-151
+ // Ensure that not a member function is called.
+ const auto *FD = dyn_cast_or_null<FunctionDecl>(Call.getDecl());
+ if (!FD || FD->getKind() != Decl::Function)
+ return nullptr;
----------------
I vaguely recall us having this conversation once, but isn't this redundant with
```lang=c++
if (!Call.isGlobalCFunction())
return nullptr;
```
? I don't mind not addressing this before commiting.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D75163/new/
https://reviews.llvm.org/D75163
More information about the cfe-commits
mailing list