Don’t expect this article to be an easy read. After each claim, I will provide supporting code in both C++ and assembly.
Recently I was working on a particularly sneaky bug. A thing happened to me in C++, that should not be possible under normal circumstances. By normal, I mean that 1+1 is guaranteed to 2; the sun rises in the East and sets in the West; all water is wet, and the earth is dry. It still happened. Namely: the vptr of a fully constructed virtual object was pointing to the virtual table of its base class. To debug this particular issue one needs to dive deep into the compiler world and into the dreaded waters of assembly.
I hope that I do not have to point out that when I started, I had no clue what is going on. I knew what virtual pointers do and that the compilers are reasonably smart about them. As every modern software engineer, I consulted the web oracle only to realize that there is very little written online. I wanted to know how vptrs and vtables are implemented. Not your typical high-level theory explaining how dynamic dispatch works. I wanted to know what makes it tick. And while doing so, I might improve the world a bit by sharing my journey. So I hopped on my trusted GDB and rode off to the assembly land.Continue reading
If you enjoyed this post, then make sure you subscribe to my Newsletter and/or Feed.