Szelethus added a comment.
And thank you for helping me along the way! :D
================
Comment at: lib/StaticAnalyzer/Checkers/MallocChecker.cpp:342
+ DefaultBool IsOptimistic;
+ MemFunctionInfoTy MemFunctionInfo;
public:
----------------
MTC wrote:
> I can't say that abstracting `MemFunctionInfo` is a perfect solution, for
> example `IsOptimistic` and `ShouldIncludeOwnershipAnnotatedFunctions ` are
> close to each other in the object layout, but they do the same thing, which
> makes me feel weird. And there are so many `MemFunctionInfo.` :)
Well the thinking here was that `MallocChecker` is seriously overcrowded --
it's a one-tool-to-solve-everything class, and moving these `IdentifierInfos`
in their separate class was pretty much the first step I took: I think it
encapsulates a particular task well and eases a lot on `MallocChecker`. Sure
`MemFunctionInfo.` is reduntant, but each time you see it, it indicates that
we're calling a function or using a data member that has no effect on the
actual analysis, that we're inquiring about more information about a given
function. and nothing more. For a checker that emits warning at seemingly
random places wherever, I think this is valuable.
By the way, it also forces almost all similar conditions in a separate line,
which is an unexpected, but pleasant help to the untrained eye:
```
if (Fun == MemFunctionInfo.II_malloc ||
Fun == MemFunctionInfo.II_whatever)
```
Nevertheless, this is the only change I'm not 100% confident about, if you
and/or others disagree, I'll happily revert it.
================
Comment at: lib/StaticAnalyzer/Checkers/MallocChecker.cpp:342
+ DefaultBool IsOptimistic;
+ MemFunctionInfoTy MemFunctionInfo;
public:
----------------
Szelethus wrote:
> MTC wrote:
> > I can't say that abstracting `MemFunctionInfo` is a perfect solution, for
> > example `IsOptimistic` and `ShouldIncludeOwnershipAnnotatedFunctions ` are
> > close to each other in the object layout, but they do the same thing, which
> > makes me feel weird. And there are so many `MemFunctionInfo.` :)
> Well the thinking here was that `MallocChecker` is seriously overcrowded --
> it's a one-tool-to-solve-everything class, and moving these `IdentifierInfos`
> in their separate class was pretty much the first step I took: I think it
> encapsulates a particular task well and eases a lot on `MallocChecker`. Sure
> `MemFunctionInfo.` is reduntant, but each time you see it, it indicates that
> we're calling a function or using a data member that has no effect on the
> actual analysis, that we're inquiring about more information about a given
> function. and nothing more. For a checker that emits warning at seemingly
> random places wherever, I think this is valuable.
>
> By the way, it also forces almost all similar conditions in a separate line,
> which is an unexpected, but pleasant help to the untrained eye:
> ```
> if (Fun == MemFunctionInfo.II_malloc ||
> Fun == MemFunctionInfo.II_whatever)
> ```
> Nevertheless, this is the only change I'm not 100% confident about, if you
> and/or others disagree, I'll happily revert it.
(leaving a separate inline for a separate topic)
The was this checker abuses checker options isn't nice at all, I agree. I could
just rename `MallocChecker::IsOptimistic` to
`MallocChecker::ShouldIncludeOwnershipAnnotatedFunctions`, and have it passed
around as a parameter in `MemFunctionInfoTy`. Would you prefer that, should you
be okay with `MemFunctionInfoTy` in general?
================
Comment at: lib/StaticAnalyzer/Checkers/MallocChecker.cpp:1087
if (FD->getKind() == Decl::Function) {
- initIdentifierInfo(C.getASTContext());
+ MemFunctionInfo.initIdentifierInfo(C.getASTContext());
IdentifierInfo *FunI = FD->getIdentifier();
----------------
MTC wrote:
> If I not wrong, `MemFunctionInfo` is mainly a class member of `MallocChecker`
> that hold a bunch of memory function identifiers and provide corresponding
> helper APIs. And we should pick a proper time to initialize it.
>
> I want to known why you call `initIdentifierInfo()` in `checkPostStmt(const
> CallExpr *E,)`, this callback is called after `checkPreCall(const CallEvent
> &Call, )` in which we need `MemFunctionInfo`.
Well, I'd like to know too! I think lazy initializing this struct creates more
problems that it solves, but I wanted to draw a line somewhere in terms of how
invasive I'd like to make this patch.
================
Comment at: lib/StaticAnalyzer/Checkers/MallocChecker.cpp:1247
+ CheckerContext &C, const Expr *E, const unsigned IndexOfSizeArg,
+ ProgramStateRef State, Optional<SVal> RetVal) {
if (!State)
----------------
MTC wrote:
> `const` qualifier missing?
This method was made `static`.
================
Comment at: lib/StaticAnalyzer/Checkers/MallocChecker.cpp:1323
+/// pointer to the type of the constructed record or one of its bases.
+static bool hasNonTrivialConstructorCall(const CXXNewExpr *NE) {
----------------
MTC wrote:
> I'm not sure `hasNonTrivialConstructorCall()` is a good name although you
> explained it in details in the comments below. And the comments for this
> function is difficult for me to understand, which is maybe my problem.
>
> And I also think this function doesn't do as much as described in the
> comments, it is just `true if the invoked constructor in \p NE has a
> parameter - pointer or reference to a record`, right?
I admit that I copy-pasted this from the source I provided below, and I
overlooked it before posting it here. I //very// much prefer what you proposed
:)
Repository:
rC Clang
https://reviews.llvm.org/D54823
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits