(Monday’s notes) (Tuesday’s notes) (Wednesday’s notes) (Epilogue)
Today’s hacking was mixed, a bit like the weather! At lunch time I hung out at the beer festival with the Collabora crowd in the sun, and one of my arms got slightly burned. This evening I went to the pub as usual (since the beer festival gets impossibly rammed on Thursday and Friday evenings) and I’m now somewhat moist from the rain.
My refactoring seems to have been successful! I only needed to fix a few silly mistakes to get the tests to pass, so I’m quite pleased.
But the last silly mistake was very annoying.
As part of eliminating the union, I replaced expressions like
t->branch.twigs with an accessor function
twigs was previously used as a variable name in a few places, and I
missed out one of the renames.
Re-using a name like this during a refactoring is asking for a cockup, but I thought the compiler would have my back because they had such different types.
So last night’s messy crash bug was caused by a line vaguely like this:
memmove(nt, twigs + s, size);
twigs is a function pointer, this is clearly nonsense. And in
fact the C standard requires an error message for arithmetic on a
function pointer. (See the constraints in section 6.5.6 of
But my code compiled cleanly with
gcc’s developers decided that pointer arithmetic is such a good idea
that it ignores this requirement in the standard unless you tell it to
-pedantic or you enable
-Wpointer-arith. And in the last year
or so I have lazily stopped using
$FANFCFLAGS since I foolishly
-Wall -Wextra covered all the important stuff.
Well, lesson learned. I should be
-pedantic and proud of it.
This afternoon I turned my prose description of how copy-on-write should work into code. It was remarkably straight-forward! The preparatory thinking and refactoring paid off nicely.
However, I forgot to implement the delete function, oops!
Rewrite the hacking branch commit history into something that makes sense. At the very least, I need a proper explanation of what happened during the refactoring.
There’s still a lot of work needed to do copy-on-write in the DNS parts of Knot, but I am feeling more confident that this week I have laid down some plausible foundations.