chrish_ericsson_atx added inline comments.

================
Comment at: 
clang-tools-extra/test/clang-tidy/checkers/bugprone/sizeof-expression.cpp:236-238
-  // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: suspicious usage of 
'sizeof(A*)'; pointer to aggregate
   sum += sizeof(PMyStruct);
-  // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: suspicious usage of 
'sizeof(A*)'; pointer to aggregate
----------------
aaron.ballman wrote:
> mizvekov wrote:
> > aaron.ballman wrote:
> > > mizvekov wrote:
> > > > chrish_ericsson_atx wrote:
> > > > > mizvekov wrote:
> > > > > > chrish_ericsson_atx wrote:
> > > > > > > njames93 wrote:
> > > > > > > > mizvekov wrote:
> > > > > > > > > Is this change really desirable, or should we put a FIXME 
> > > > > > > > > here?
> > > > > > > > Not warning on these cases seems like a pretty big red flag, 
> > > > > > > > especially the `MyStruct *`.
> > > > > > > Thank you for your comment!  I'm not sure I fully agree that this 
> > > > > > > is a red flag.  I'm inclined to think that whether or not there 
> > > > > > > should be a warning on `MyStruct *` or `PMyStruct` is a pretty 
> > > > > > > subjective.  These are both very common idioms, and are 
> > > > > > > meaningful.  I do appreciate the perspective that `MyStruct *` is 
> > > > > > > just one character different from `MyStruct`, and as such, it 
> > > > > > > might be a typo to ask for sizeof the pointer, when you really 
> > > > > > > wanted sizeof the struct.  But the counter-argument (accidentally 
> > > > > > > asking for sizeof the struct when you really wanted the pointer 
> > > > > > > size) is just as valid-- and the checker obviously cannot warn in 
> > > > > > > that case.   
> > > > > > > 
> > > > > > > I am perfectly fine with kicking the can down the road a bit by 
> > > > > > > replacing the discarded `// CHECK-MESSAGES` directive with a `// 
> > > > > > > FIXME`, as @mizvekov suggested.  I expect that when someone 
> > > > > > > circles back to really deeply reconsider the semantics of this 
> > > > > > > checker, there will be a number of changes (other existing 
> > > > > > > warnings dropped, warnings for new and missed cases added, much 
> > > > > > > better sync between C and C++, as well as intentional 
> > > > > > > consideration of things like __typeof__ (in it's various forms) 
> > > > > > > and decltype, rather than the haphazard coarse-grain matching 
> > > > > > > that seems to be going on now.
> > > > > > I agree with this patch only in so far that:
> > > > > > 
> > > > > > * This is effectively a partial revert of the changes made in 
> > > > > > https://reviews.llvm.org/rG15f3cd6bfc670ba6106184a903eb04be059e5977
> > > > > > * The checker was pretty much buggy to begin with.
> > > > > > * That change significantly increased the amount of patterns we 
> > > > > > would accept, but at the same time the existing tests did not pick 
> > > > > > that up and this was not carefully considered.
> > > > > > * It seems unreasonable that there is effectively no way to shut 
> > > > > > this warning up per site, except by a NOLINT directive.
> > > > > > 
> > > > > > If the amount of false positives is so high now that this check is 
> > > > > > unusable, then this is just a question of reverting to a less 
> > > > > > broken state temporarily.
> > > > > > 
> > > > > > But otherwise we can't leave it in the reverted state either. 
> > > > > > Without that change to use the canonical type or something similar, 
> > > > > > there is no reason to suppose any of these test cases would work at 
> > > > > > all as clang evolves and we improve the quality of implementation 
> > > > > > wrt type sugar retention.
> > > > > @mizvekov, I agree with your reasoning for saying "we can't leave it 
> > > > > in the reverted state either".  But I'm not sure how to ensure that 
> > > > > this gets the needed attention.  Should we just file a separate PR on 
> > > > > github to track the needed refactoring?  I do not believe I'll have 
> > > > > the bandwidth to look at this in the next few months.
> > > > > 
> > > > > In the meantime, assuming the bots are happy with patchset 2, I'll 
> > > > > land this as-is later today.
> > > > > 
> > > > > Thank you very much for your feedback!
> > > > Oh please wait for others to review, I don't think landing today is 
> > > > reasonable!
> > > > 
> > > > I am not really a stakeholder for this checker except for that original 
> > > > change.
> > > > 
> > > > I would advise for you to wait for another more responsible reviewer to 
> > > > accept as well before merging, unless this gets stale for a long time 
> > > > and no one else seems to be interested.
> > > > Thank you for your comment! I'm not sure I fully agree that this is a 
> > > > red flag. I'm inclined to think that whether or not there should be a 
> > > > warning on MyStruct * or PMyStruct is a pretty subjective. These are 
> > > > both very common idioms, and are meaningful. I do appreciate the 
> > > > perspective that MyStruct * is just one character different from 
> > > > MyStruct, and as such, it might be a typo to ask for sizeof the 
> > > > pointer, when you really wanted sizeof the struct. But the 
> > > > counter-argument (accidentally asking for sizeof the struct when you 
> > > > really wanted the pointer size) is just as valid-- and the checker 
> > > > obviously cannot warn in that case.
> > > 
> > > I agree with @njames93 that this is a red flag. That check behavior is 
> > > explicitly documented: 
> > > https://releases.llvm.org/13.0.1/tools/clang/tools/extra/docs/clang-tidy/checks/bugprone-sizeof-expression.html#suspicious-usage-of-sizeof-a
> > >  so this change is introducing a different kind of regression.
> > > 
> > > (However, there's no option for disabling that specific situation and I 
> > > think there probably should be one, eventually.)
> > This revert is almost entirely knocking out this `PointerToStructType` 
> > matcher, which matches `sizeof` of any record which is not written as an 
> > address-of operator expression.
> > 
> > I think with this revert and after the elaboratedType patch changes, the 
> > only case that should still trigger it should be a type substitution for a 
> > template argument written as a pointer to Record, because that should 
> > canonicalize the pointee without adding any other sugar on it.
> > 
> > It won't match a `pointer-to-sugar-to-record` anymore at all, as it 
> > happened before the ElaborateType patch, but before that patch, there was 
> > an additional case that would match: A pointer to a struct written without 
> > any elaboration, because we would not put any sugar on top of the 
> > RecordType.
> > 
> > The documentation does mention the `Suspicious usage of ‘sizeof(A*)’` case, 
> > but it only gives as an example the `sizeof-address-of-expression` case, 
> > even though that is handled separately in the implementation here and not 
> > affected.
> > 
> > So I guess that might explain the contention here about the seriousness of 
> > this regression.
> > The documentation does mention the Suspicious usage of ‘sizeof(A*)’ case, 
> > but it only gives as an example the sizeof-address-of-expression case, even 
> > though that is handled separately in the implementation here and not 
> > affected.
> >
> > So I guess that might explain the contention here about the seriousness of 
> > this regression.
> 
> Yeah, those docs only show the expression case and not the type case. That's 
> an interesting point! It also says `These cases may occur because of explicit 
> cast or implicit conversion.` which sure implies that this is an expression 
> check rather than a type check.
> 
> I dug through the history to find the original review for this feature to see 
> if this was discussed. That review is: https://reviews.llvm.org/D19014 I 
> didn't spot any indication this was meant to diagnose `sizeof(some_type)`.
> 
> So I guess I'm wrong on this being a red flag!
I understand the concerns.  And I agree with @mizvekov's rationale that the 
documentation doesn't explicitly cover the two pre-existing cases that this 
change affects.  

To further support that, the documentation describing diags for `sizeof(A*)` 
were introduced when the checker was introduced in 
https://reviews.llvm.org/D19014 in 2016.  But the two test cases that are 
affected by my change were introduced 3 years later in 
https://reviews.llvm.org/D61260, and documentation was not updated as part of 
that later change.

That later change by @baloghadamsoftware seems to have been intended to broaden 
the checker to explicitly catch attempts to take sizeof struct-pointer or 
values of that type -- and my change largely reverts that behavior, but doesn't 
affect the original behavior of the checker (as documented).  Looking at the 
review comments, I don't get a sense that the false positive rate for 
`sizeof(A*)` was considered carefully, and in particular, there was no 
discussion of targets with multiple address spaces and different size pointers, 
respectively, where one would expect to see `sizeof(A*)` done rather commonly, 
and clearly intentionally.

I reached out separately to Ádám for guidance on this change, and he's included 
on this review.  I'll wait a bit to give him an opportunity to comment here.


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

https://reviews.llvm.org/D131926

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

Reply via email to