How did people ever complete Incursion?
Sometimes when I fix a bug, I wonder how people ever completed Incursion. Take this one for example.
The definition:
struct EventInfo { EventInfo& operator=(EventInfo &e) { /* Memory image copy for the int/bool/ptr members */ // Implementation doing a quick copy, allocating instances of subobjects. return *this; } // Rest of the normal code for this struct. }
One problem situation:
bool Magic::isTarget(EventInfo &_e, Thing *t) { EventInfo e = _e; // Rest of this function. }
When isTarget exits, then _e is corrupted. This is because EventInfo only provides an assignment operator overload. However an assignment in a variable declaration uses the copy constructor, and in the absence of one, does a bitwise copy. Pointers to sub-objects then become shared, and the first version of EventInfo to be destroyed will destroy those sub-objects assuming itself to be the owner. In this case, it will be e which as a stack variable will be freed when the function returns.
Incursion is littered with perhaps a dozen cases where the bitwise copy constructor would have been employed. Each one a potential crash, if not source of corruption.
Good times!