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