<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/120987>120987</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[TySan] false positive with unions and placement-new
</td>
</tr>
<tr>
<th>Labels</th>
<td>
false-positive
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Jannik2099
</td>
</tr>
</table>
<pre>
According to https://eel.is/c++draft/class.union#general-6 , the active union member in an union of non-POD types can be switched by invoking the dtor of the old member, and placement new-ing into the new member.
However, tysan does not seem to like this https://godbolt.org/z/nvnjzjGez
```cpp
#include <cstdio>
#include <new>
class Foo {
private:
short i{};
public:
Foo() { printf("Foo nontrivial ctor\n"); }
~Foo() { printf("Foo nontrivial dtor\n"); }
};
class Bar {
private:
int i{};
public:
Bar() { printf("Bar nontrivial ctor\n"); }
~Bar() { printf("Bar nontrivial dtor\n"); }
};
union U {
Foo foo;
Bar bar;
~U() {}
};
int main() {
U u{ .foo = {}};
u.foo.~Foo();
new (&u.bar) Bar;
}
```
```
==1==ERROR: TypeSanitizer: type-aliasing-violation on address 0x7ffff9117e2c (pc 0x61eed1b9b89d bp 0x7ffff9117d10 sp 0x7ffff9117cb8 tid 1)
WRITE of size 4 at 0x7ffff9117e2c with type int (in Bar at offset 0) accesses an existing object of type short (in Foo at offset 0)
#0 0x61eed1b9b89c (/app/output.s+0x2b89c)
```
This also happens with an union of POD or trivial types, but I'm not 100% sure on the standard working if placement-new is supposed to be allowed in these cases.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyMVU1v4zgP_jXKhYhhy_nyIYdkMnnf2cssOh3smZboWFNFMiQ5aXrob1_QTpF-bIECAWJR5MNPPcQYzcERrcV8K-a7Cfap9WH9FzpnHmReVZPa68t6o5QP2rgDJA9tSl0U5UbIvZB7IpuZKOReCbkVcqsDNomPFmPMeme8E7I8kKOAdroAIb9BaglQJXMiGBTgSMeaAhgH6K4i34Dzbvr3zx2kS0cRFDqoCeLZJNWShvoCxp38wxBVS6CTD2zF397qKya7Q6ehs6joSC6Bo_OUbYxLflB2dL4qZyLfiHzzf3-m02iaLhEdaE8RnE8QiY5cAmseCFJr4rtiHLyuvU2ZDwch909C7t3J_Xn68z96GqHFIh9_quv4KEvjlO01gSi_qZi08aL8_uHG0fkqzjdDYWHvPYjlVuQbAOiCOWEiDmM4Q2x9SGBYYbkT5Xa0hK6vrVE3tb33Qq6ErBiKUVxqBoFkeOddCuZk0IJKPoj5NyekFLIS5RYYdwR5_jKK_gTldYxjdlsMn2Vn3H8kBh9S22L4JCjG_kpqz1-G-Epe41D_vmU1dLDxftS4hgw1hpvg-ffN_0dELsQRjXsV49XuN_R8yhqekXL3Yv5iCz3fZLe-3TzyUxhkiz7jUGQ1FHJ0OUbwMsDv5pm_y50od8X49_3u7uedKDdwf-noFzqTzBMFFvBrnqI1GI07TE_GW0zDg3eAWgeKEfLHZdM0TVUUS5KKI-oU5I-LgkgXdVWvKg1191pNFznENxJVryAZDQUnmG_-uftx_53pIZonghlgeu_lbFI7BDeMmJAr44aWYALfNJES5FwPVIpipMhMRY8mJuYSX_8hlQb2YYDx-Y0Q3Oa3ENdaC1nmb5NSY-332HVC7n2fuj5lUcht_ij5erR914F7ZiG00UOLXUcujom85lHmUB_gZVwHOmVyq_sEP4RcHgduK_JcyDnEPhD3gpkxJnQag4azDwPPmuZGpFMeFhMh9l3nI2nmxZoArfVn0szlqaVIoDBSzCZ6XeqqrHBC62JZzqrlYlVVk3a9aHA2n-F8peqmLDTO6gJRLpdqsWoWZb2cmLXM5ayQsixWeVFW2UoVKp9JrNW8yTUWYpbTEY3NrD0dmXonJsae1oXMq9VyYrEmG4cFJ2WDNtK089Hw9uEHO99Nwpotp3V_iGKWWxNTvGElk-ywHu8vv9CJ-Q4GDHjBGMs91Dq-3TRcoEkf7PrdjjCp7etM-aOQe3Zz_Zt2wfMUCbkf4uedek3htJb_BgAA__-T6lFi">