aaron.ballman added inline comments.

================
Comment at: 
clang-tools-extra/test/clang-tidy/checkers/bugprone-easily-swappable-parameters-len2.cpp:10
+
+void declaration(int Param, int Other); // NO-WARN: No chance to change this 
function.
+
----------------
whisperity wrote:
> aaron.ballman wrote:
> > whisperity wrote:
> > > aaron.ballman wrote:
> > > > whisperity wrote:
> > > > > aaron.ballman wrote:
> > > > > > I think this is a case where we could warn when the declaration is 
> > > > > > outside of a system header (perhaps as an option).
> > > > > > 
> > > > > > Thinking about it a bit more, declarations and definitions provide 
> > > > > > a novel way to get another kind of swap:
> > > > > > ```
> > > > > > void func(int x, int y);
> > > > > > void func(int y, int x) {} // Oops, the swap was probably not 
> > > > > > intentional
> > > > > > ```
> > > > > > which may or may not be interesting for a check (or its heuristics).
> > > > > I gave this some thought. It is a very good idea, but I believe not 
> > > > > for //this// check, but D20689. What do you think of that? Maybe 
> > > > > simply saying "call site v. function node that was called" could be 
> > > > > extended with a completely analogous, string distance function based 
> > > > > "function definition node v. redecl chain" case.
> > > > Hmmm, my impression is that this check is fundamentally about 
> > > > *parameter* ordering whereas D20689 is about *argument* ordering. Given 
> > > > that the example is about the ordering of parameters and doesn't have 
> > > > anything to do with call sites, I kind of think the functionality would 
> > > > be better in a parameter-oriented check.
> > > > 
> > > > That said, it doesn't feel entirely natural to add it to this check 
> > > > because this check is about parameters that are easily swappable *at 
> > > > call sites*, and this situation is not exactly that. However, it could 
> > > > probably be argued that it is appropriate to add it to this check given 
> > > > that swapped parameters between the declaration and the definition are 
> > > > likely to result in swapped arguments at call sites.
> > > > 
> > > > Don't feel obligated to add this functionality to this check (or invent 
> > > > a new check), though.
> > > It just seems incredibly easier to put it into the other check, as that 
> > > deals with names. But yes, then it would be a bit weird for the 
> > > "suspicious call argument" check to say something about the definition... 
> > > This check (and the relevant Core Guideline) was originally meant to 
> > > consider **only** types (this is something I'll have to emphasise more in 
> > > the research paper too!). Everything that considers //names// is only for 
> > > making the check less noisy and make the actually emitted results more 
> > > useful. However, I feel we should //specifically// not rely on the names 
> > > and the logic too much.
> > > 
> > > But(!) your suggestion is otherwise a good idea. I am not sure if the 
> > > previous research (with regards to names) consider the whole "forward 
> > > declaration" situation, even where they did analysis for C projects, not 
> > > just Java.
> > > However, I feel we should specifically not rely on the names and the 
> > > logic too much.
> > 
> > I agree, to a point. I don't think the basic check logic should be 
> > name-sensitive, but I do think we need to rely on names to tweak the 
> > true/false positive/negative ratios. I think most of the time when we're 
> > relying on names should wind up being configuration options so that users 
> > can tune the algorithm to their needs.
> > 
> > We could put the logic into the suspicious call argument check with roughly 
> > the same logic -- the call site looks like it has potentially swapped 
> > arguments because the function redeclaration chain (which includes the 
> > function definition, as that's also a declaration) has inconsistent 
> > parameter names. So long as the diagnostic appears on the call site, and 
> > then refers back to the inconsistent declarations, it could probably work. 
> > However, I think it'd be a bit strange to diagnose the call site because 
> > the user of the API didn't really do anything wrong (and they may not even 
> > be able to change the declaration or the definition where the problem 
> > really lives).
> But wait... suppose there is a project A, which sees the header for `f(int x, 
> int y)` and has a call `f(y, x)`. That will be diagnosed. But if project A is 
> only a client of `f`, it should be highly unlikely that project A has the 
> //definition// of `f` in their tree, right? So people of A will not get the 
> warning for that. Only what is part of the compilation process will be part 
> of the analysis process.
> 
> Similarly to how this check matches **only** function definitions, and never 
> a prototype. The latter one would have bazillion of warnings from every 
> header ever, with the user not having a chance to fix it anyways.
> But wait... suppose there is a project A

That's the point I was trying to make about it being strange to diagnose on the 
call site -- the user of the API didn't use it wrong, the designer of the API 
did something bad.

It's sounding more like this functionality is a good idea for a new check 
rather than an existing check.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D69560/new/

https://reviews.llvm.org/D69560

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

Reply via email to