MTC added inline comments.

================
Comment at: lib/StaticAnalyzer/Checkers/DanglingInternalBufferChecker.cpp:32
                                                      check::PostCall> {
-  CallDescription CStrFn;
+  const llvm::SmallVector<CallDescription, 4> CStrFnFamily = {
+    {"std::basic_string<char>::c_str"}, {"std::basic_string<char32_t>::c_str"},
----------------
NoQ wrote:
> xazax.hun wrote:
> > I am not sure if this is the right solution in case of this check. We 
> > should track `c_str` calls regardless of what the template parameter is, so 
> > supporting any instantiation of `basic_string` is desired. This might not 
> > be the case, however, for other checks. 
> > 
> > If we think it is more likely we do not care about the template arguments, 
> > maybe a separate API could be used, where we pass the qualified name of the 
> > class separately without the template arguments.
> > Alternatively, we could use matches name so the users could use regexps.
> > 
> > At this point I also wonder what isCalled API gives us compared to 
> > matchers? Maybe it is more convenient to use than calling a `match`. Also, 
> > isCalled API has an IdentifierInfo cached which could be used for 
> > relatively efficient checks.
> > 
> > @NoQ what do you think?
> > 
> > 
> I agree that it's better to match the chain of classes and namespaces (in as 
> much detail as the user cares to provide) and discard template parameters.
> 
> For example, i wish that a `CallDescription` that's defined as `{"std", 
> "basic_string", "c_str"}` would be able to match both `std::string::c_str()` 
> and `std::__1::string::c_str()`.
Yea, checker writers may can't provide all the template arguments, and it's not 
convenient to use!

I will try to give a better solution!


================
Comment at: lib/StaticAnalyzer/Checkers/DanglingInternalBufferChecker.cpp:65
   auto *TypeDecl = TypedR->getValueType()->getAsCXXRecordDecl();
   if (TypeDecl->getName() != "basic_string")
     return;
----------------
xazax.hun wrote:
> If we check for fully qualified names, this check might be redundant.
Right, thanks!


================
Comment at: lib/StaticAnalyzer/Core/CallEvent.cpp:273
+  auto Matches =
+      match(namedDecl(hasName(CD.FuncName)).bind("match_qualified_name"), *ND,
+            LCtx->getAnalysisDeclContext()->getASTContext());
----------------
xazax.hun wrote:
> Doesn't match also traverse the subtree of the AST? We only need to check if 
> that particular node matches the qualified name. I wonder if we could, during 
> the traversal, find another node that is a match unintentionally.
Yea, this maybe a problem, I will test whether this is going to happen and give 
a fine-grained match. Thanks!



Repository:
  rC Clang

https://reviews.llvm.org/D48027



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to