Apparently it's impolite to ask GCC to subtract two pointers.
authorGuus Sliepen <guus@tinc-vpn.org>
Sun, 13 Sep 2009 12:08:59 +0000 (14:08 +0200)
committerGuus Sliepen <guus@tinc-vpn.org>
Sun, 13 Sep 2009 12:08:59 +0000 (14:08 +0200)
commit75773efe2689d347a2f219c5f27e4a82eef1236b
tree7d9d6bc56227776fcf802a6c98c780a04af0afed
parent23e151aeed6b3ffe0fab10f51ffdb134deb7a852
Apparently it's impolite to ask GCC to subtract two pointers.

If two pointers do not belong to the same array, pointer subtraction gives
nonsensical results, depending on the level of optimisation and the
architecture one is compiling for. It is apparently not just subtracting the
pointer values and dividing by the size of the object, but uses some kind of
higher magic not intended for mere mortals. GCC will not warn about this at
all. Casting to void * is also a no-no, because then GCC does warn that strict
aliasing rules are being broken. The only safe way to query the ordering of two
pointers is to use the (in)equality operators.

The unsafe implementation of connection_compare() has probably caused the "old
connection_t for ... still lingering" messages. Our implementation of AVL trees
is augmented with a doubly linked list, which is normally what is traversed.
Only when deleting an old connection the tree itself is traversed.
src/connection.c