[PATCH] D34275: [analyzer] Re-implemente current virtual calls checker in a path-sensitive way
Gábor Horváth via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Jun 20 01:38:49 PDT 2017
xazax.hun added a comment.
I do not see any test cases for this patch. Could you add them as well?
Are you sure that this representation is ok?
How do you handle the following case?
struct A {
A() {
X x;
x.virtualMethod(); // this virtual call is ok
}
}
int main() {
A a;
}
================
Comment at: VirtualCallChecker.cpp:44
+ private:
+ const unsigned Flag;
+ bool Found;
----------------
The name of this flag is not descriptive enough. Please choose a name that refers to what are you using this value for.
================
Comment at: VirtualCallChecker.cpp:79
+ ProgramStateRef state = N->getState();
+ const unsigned ctorflag = state->get<ConstructorFlag>();
+ const unsigned dtorflag = state->get<DestructorFlag>();
----------------
Variable names should start with uppercase letter.
================
Comment at: VirtualCallChecker.cpp:83
+ const CXXConstructorDecl *CD =
+ dyn_cast<CXXConstructorDecl>(LCtx->getDecl());
+ const CXXDestructorDecl *DD =
----------------
Are you sure that the LCtx->getDecl can not return null?
================
Comment at: VirtualCallChecker.cpp:114
+ CheckerContext &C) const {
+ const Decl *D = dyn_cast_or_null<Decl>(Call.getDecl());
+ if (!D)
----------------
Do you need this cast here?
================
Comment at: VirtualCallChecker.cpp:119
+ ProgramStateRef state = C.getState();
+ const unsigned ctorflag = state->get<ConstructorFlag>();
+ const unsigned dtorflag = state->get<DestructorFlag>();
----------------
Querying the state is not free, I think you should also query something from the state once you are sure that you will need that.
================
Comment at: VirtualCallChecker.cpp:158
+ // GDM of constructor and destructor.
+ if (isVirtualCall(CE) && ctorflag > 0 && state->get<ObjectFlag>() == 0) {
+ if (!BT_CT) {
----------------
I don't think this is the right approach. Once you increased the ObjectFlag on a path, you will never report anything on that path anymore. I think it might be better to have a map from Symbols (representing this) to ctor/dtors or some other approach.
================
Comment at: VirtualCallChecker.cpp:260
+ if (SFC->inTopFrame()) {
+ const FunctionDecl *FD = SFC->getDecl()->getAsFunction();
+ if (!FD)
----------------
The formatting seems to be off here I recommend using clang format.
https://reviews.llvm.org/D34275
More information about the cfe-commits
mailing list