(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(t)
. However
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);
When 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
C99:TC3.)
But my code compiled cleanly with -Wall -Wextra
.
Annoyingly, 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
be -pedantic
or you enable -Wpointer-arith
. And in the last year
or so I have lazily stopped using $FANFCFLAGS
since I foolishly
thought -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.
Tests!
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.