jbcoe marked 5 inline comments as done.
jbcoe added a comment.

Handling code like `std::pair<std::vector<bool>, int>` is currently eluding me.

If I define `std::pair` to have members `first` and `second` then 
`std::pair<std::vector<bool>, int>` triggers the `vector<bool>` diagnostic but 
in the template, not the instantiation point.

I need to match class definitions that have `vector<bool>` as a template 
argument and exclude them from later matchers. I can't see how to do this right 
now. I suspect some more sophisticated matchers or approaches are needed.



================
Comment at: clang-tools-extra/clang-tidy/safety/NoVectorBoolCheck.cpp:50
+    diag(MatchedDecl->getLocation(),
+         " function %0 returns an instance of std::vector<bool>")
+        << MatchedDecl;
----------------
JonasToth wrote:
> jbcoe wrote:
> > djehuti wrote:
> > > JonasToth wrote:
> > > > i think all those diag() calls can be merged into one. inside the 
> > > > if/else-if you can just set a StringRef with the specific part of the 
> > > > warning, and have a parameterized diag() at the end of the function.
> > > > 
> > > > in NoMallocCheck there is a similar pattern:
> > > > 
> > > >   const CallExpr *Call = nullptr;                                       
> > > >        
> > > >   StringRef Recommendation;                                             
> > > >        
> > > >                                                                         
> > > >        
> > > >   if ((Call = Result.Nodes.getNodeAs<CallExpr>("aquisition")))          
> > > >        
> > > >     Recommendation = "consider a container or a smart pointer";         
> > > >        
> > > >   else if ((Call = Result.Nodes.getNodeAs<CallExpr>("realloc")))        
> > > >        
> > > >     Recommendation = "consider std::vector or std::string";             
> > > >        
> > > >   else if ((Call = Result.Nodes.getNodeAs<CallExpr>("free")))           
> > > >        
> > > >     Recommendation = "use RAII";                                        
> > > >        
> > > >                                                                         
> > > >        
> > > >   assert(Call && "Unhandled binding in the Matcher");                   
> > > >        
> > > >                                                                         
> > > >        
> > > >   diag(Call->getLocStart(), "do not manage memory manually; %0")        
> > > >        
> > > >       << Recommendation << SourceRange(Call->getLocStart(), 
> > > > Call->getLocEnd());
> > > > 
> > > Except with braces, right? (That's another High-Integrity C++ rule btw.)  
> > > ;)
> > I agree that this _can_ be done but I'm not convinced it helps readability. 
> > Repetition is partial and very localized. I'll happily make the change if 
> > you feel strongly that it's an improvement.
> i think either is ok. maybe someone else prefers one strongly over the other, 
> but i dont mind.
> 
> but i think the else path should exist, make an failing assert or sth like 
> that, for the safety ;)
Agreed on the else, especially as it agrees with the safety-critical standards 
we're checking.


================
Comment at: clang-tools-extra/clang-tidy/safety/NoVectorBoolCheck.cpp:50
+    diag(MatchedDecl->getLocation(),
+         " function %0 returns an instance of std::vector<bool>")
+        << MatchedDecl;
----------------
jbcoe wrote:
> JonasToth wrote:
> > jbcoe wrote:
> > > djehuti wrote:
> > > > JonasToth wrote:
> > > > > i think all those diag() calls can be merged into one. inside the 
> > > > > if/else-if you can just set a StringRef with the specific part of the 
> > > > > warning, and have a parameterized diag() at the end of the function.
> > > > > 
> > > > > in NoMallocCheck there is a similar pattern:
> > > > > 
> > > > >   const CallExpr *Call = nullptr;                                     
> > > > >          
> > > > >   StringRef Recommendation;                                           
> > > > >          
> > > > >                                                                       
> > > > >          
> > > > >   if ((Call = Result.Nodes.getNodeAs<CallExpr>("aquisition")))        
> > > > >          
> > > > >     Recommendation = "consider a container or a smart pointer";       
> > > > >          
> > > > >   else if ((Call = Result.Nodes.getNodeAs<CallExpr>("realloc")))      
> > > > >          
> > > > >     Recommendation = "consider std::vector or std::string";           
> > > > >          
> > > > >   else if ((Call = Result.Nodes.getNodeAs<CallExpr>("free")))         
> > > > >          
> > > > >     Recommendation = "use RAII";                                      
> > > > >          
> > > > >                                                                       
> > > > >          
> > > > >   assert(Call && "Unhandled binding in the Matcher");                 
> > > > >          
> > > > >                                                                       
> > > > >          
> > > > >   diag(Call->getLocStart(), "do not manage memory manually; %0")      
> > > > >          
> > > > >       << Recommendation << SourceRange(Call->getLocStart(), 
> > > > > Call->getLocEnd());
> > > > > 
> > > > Except with braces, right? (That's another High-Integrity C++ rule 
> > > > btw.)  ;)
> > > I agree that this _can_ be done but I'm not convinced it helps 
> > > readability. Repetition is partial and very localized. I'll happily make 
> > > the change if you feel strongly that it's an improvement.
> > i think either is ok. maybe someone else prefers one strongly over the 
> > other, but i dont mind.
> > 
> > but i think the else path should exist, make an failing assert or sth like 
> > that, for the safety ;)
> Agreed on the else, especially as it agrees with the safety-critical 
> standards we're checking.
LLVM/Clang tends not to use braces for single statement control flow, but maybe 
we should follow safety-critical rules in a safety-critical check?


https://reviews.llvm.org/D29118



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

Reply via email to