.@ Tony Finch – blog

(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.

Non-conformant C compilers

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!


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.