Do we really have clients that modify the data ?
If so, can we have a separate <code> const char * BufferView(const Buffer * buffer) { return buffer->contents; } </code> that can let the caller do arbitrary *read-only* things with the data pointed to ?  This would *not* invalidate the buffer's size, for example.