https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121180

            Bug ID: 121180
           Summary: std::any allows for creating multiple empty objects of
                    the same type at the same address
           Product: gcc
           Version: 16.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: luigighiron at gmail dot com
  Target Milestone: ---

The following program demonstrates how std::any can create two objects with the
same type at the same address:

#include<any>
#include<iostream>
struct A{};
struct B:A{};
struct C:A{};
struct D:A{};
struct E:A{};
struct F:A{};
struct G:A{};
struct H:A{};
struct I:A{};
struct J:A{};
struct K:B,C,D,E,F,G,H,I,J{
    std::any k;
};
int main(){
    K x;
    x.k=A{};
    std::cout<<"address of A in any: "<<&std::any_cast<A&>(x.k)<<'\n';
    std::cout<<"address of A in base class: "<<&(A&)(J&)x<<'\n';
    std::cout<<"comparison of addresses:
"<<std::boolalpha<<(&std::any_cast<A&>(x.k)==&(A&)(J&)x)<<'\n';
}

When compiled on 64 bit x86, this prints two identical addresses and then the
comparison results in true. That is, the A base class of J in x has the same
address as the A object stored in x.k.

Reply via email to