📄 vbase5.c
字号:
// Copyright (C) 2000 Free Software Foundation, Inc.// Contributed by Nathan Sidwell 19 Jan 2001 <nathan@codesourcery.com>// Bug 1701. building a vbase path was not using the shortest number of// vbases. Normally that's just a pessimization, unfortunately during// constructoring it leads to uninitialized reads.extern "C" int printf (...);int fail = 0;/*{{{ struct Base*/struct Base{ unsigned m; static Base *addr; Base (); virtual ~Base ();};/*}}}*/Base *Base::addr;/*{{{ Base::Base ()*/Base::Base (){ printf ("Base (%u) ctor %x\n", sizeof (Base), this); if (fail) ; else if (addr) fail = 1; else addr = this;}/*}}}*//*{{{ Base::~Base ()*/Base::~Base (){ printf ("Base dtor %x\n", this); if (fail) ; else if (this != addr) fail = 2; else addr = 0;}/*}}}*//*{{{ struct M10 : virtual Base*/struct M10 : virtual Base{ int m; static M10 *addr; M10 (); virtual ~M10 ();};/*}}}*/M10 *M10::addr;/*{{{ M10::M10 ()*/M10::M10 (){ printf ("M10 (%u) ctor %x\n", sizeof (M10), this); if (fail) ; else if (addr) fail = 3; else addr = this;}/*}}}*//*{{{ M10::~M10 ()*/M10::~M10 (){ printf ("M10 dtor %x\n", this); if (fail) ; else if (this != addr) fail = 4; else addr = 0;}/*}}}*//*{{{ struct M4 : virtual Base, virtual M10*/struct M4 : virtual Base, virtual M10{ int m; static M4 *addr; M4 (); virtual ~M4 ();};/*}}}*/M4 *M4::addr;/*{{{ M4::M4 ()*/M4::M4 (){ printf ("M4 (%u) ctor %x\n", sizeof (M4), this); if (fail) ; else if (addr) fail = 5; else addr = this;}/*}}}*//*{{{ M4::~M4 ()*/M4::~M4 (){ printf ("M4 dtor %x\n", this); if (fail) ; else if (this != addr) fail = 6; else addr = 0;}/*}}}*//*{{{ struct M5 : M4*/struct M5 : M4{ int m; static M5 *addr; M5 (); virtual ~M5 ();};/*}}}*/M5 *M5::addr;/*{{{ M5::M5 ()*/M5::M5 (){ printf ("M5 (%u) ctor %x\n", sizeof (M5), this); if (fail) ; else if (addr) fail = 7; else addr = this;}/*}}}*//*{{{ M5::~M5 ()*/M5::~M5 (){ printf ("M5 dtor %x\n", this); if (fail) ; else if (this != addr) fail = 8; else addr = 0;}/*}}}*//*{{{ struct M9 : M5, virtual M10*/struct M9 : M5, virtual M10{ int m; static M9 *addr; M9 (); virtual ~M9 ();};/*}}}*/M9 *M9::addr;/*{{{ M9::M9 ()*/M9::M9 (){ printf ("M9 (%u), ctor %x\n", sizeof (M9), this); if (fail) ; else if (addr) fail = 9; else addr = this;}/*}}}*//*{{{ M9::~M9 ()*/M9::~M9 (){ printf ("M9 dtor %x\n", this); if (fail) ; else if (this != addr) fail = 10; else addr = 0;}/*}}}*/int main (){ M9 *m9; Base *r; m9 = new M9 (); r = m9; if (fail) return fail; void *top = dynamic_cast <void *> (r); if (top != m9) return 20; r->~Base (); return fail;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -