Monthly Archives: May 2016

Introduction

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.

Short Problem Definition:

Given a word w, rearrange the letters of w to construct another word in such a way that is lexicographically greater than w. In case of multiple possible answers, find the lexicographically smallest one among them.

Link

Complexity:

time complexity is O(N)

space complexity is O(N)

Execution:

This task challenges us to find the next permutation of any given array. There are many implementations available online and it is worthwhile comparing them . I would recommend reading the article by Nayuki or re-implementing the std::next_permutation.