smanna12 wrote:

> I'm sorry, @smanna12, I misread the code earlier and misled you. That 
> `PunnedPointer` assignment operator I directed you too isn't a copy 
> assignment operator (it takes a `intptr_t`, not a reference or value of 
> `PunnedPointer`). Changing that assignment operator won't affect this issue 
> since it isn't used by the (compiler generated) copy assignment operators of 
> `PointerIntPair` and `ObjCMethodList`.
> 
> In practice, I think the existing code is fine as is. From the perspective of 
> the C++ standard, I'm genuinely unsure whether there is an issue or not. 
> Consider the following example. https://godbolt.org/z/WsYsYr6ob.
> 
> ```
> struct X {
>   char d[257];
> };
> X& f(X &x) {
>   x = x;
>   return x;
> }
> ```
> 
> Under optimization, all four compilers (presumably) recognize the self 
> assignment and optimize away the copy of `x.d`. Without optimization, Clang 
> implements the copy via a call to `memcpy()`, MSVC emits a `rep movsb` 
> instruction, and gcc and icc both omit the copy. According to the C++ 
> standard (via deference to the C standard), `memcpy()` requires 
> non-overlapping source and destination regions. The use of `memcpy()` by 
> Clang therefore results in undefined behavior unless the implementation of 
> `memcpy()` that is called handles overlapping memory (which it likely does in 
> this case).
> 
> The C++ standard does not state whether the compiler generated copy 
> assignment operator is required to handle self assignment for data members of 
> array type. All it says is 
> ([[class.copy.assign]p(12.2)](http://eel.is/c++draft/class.copy.assign#12.2):
> 
> > if the subobject is an array, each element is assigned, in the manner 
> > appropriate to the element type;
> 
> I think we should triage the static analysis issue as a false positive and 
> abandon this PR for now. I'll follow up with the WG21 core working group to 
> see if there is a core issue here.

Thanks @tahonermann for detailed explanation. 

https://github.com/llvm/llvm-project/pull/97933
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to