Re: A case for `void *' for pointers to arbitrary (byte) buffers

Daniel Jacobowitz
2005-05-03T20:23:57Z

On Tue, May 03, 2005 at 10:13:01PM +0200, Mark Kettenis wrote:
> Do we need a `bfd_byte *' or `gdb_byte *'?
> ------------------------------------------
>
> We might. Many implementations will need to cast to some sort of byte
> type to do arithmetic or look at individual bytes. As we have seen,
> using can be `char *' is problematic. In most (problematic) cases we
> really mean `unsigned char', only a few will warrant `signed char'.
> And `bfd_byte *' is a nice abbreviation. Personally I'm perfectly
> happy with writing `unsigned char'. IMHO it has the benefit that it
> is perfectly clear that this type is unsigned, even to someone who has
> never been exposed to the GDB codebase.

I think that using gdb_byte has a consistency advantage over typing
"unsigned char" everywhere. We will know that we are dealing with
opaque blobs of (usually) target memory, but retain the ability
to do arithmetic on them.

> Why not use `xxx_byte *' instead of `void *'?
> ---------------------------------------------
>
> * It's nonstandard. Why do we need a nonstandard type if a perfectly
> god standard type is available?
>
> * It doesn't really solve the issue. It only propagates the problem
> one level up or down. Since `xxx_byte *' is nothing but a typedef
> for `unsigned char *', someone calling a functions with `xxx_byte *'
> as one of its arguments with a `char *' argument will suffer from
> the warning that raised this entire issue; `void *' breaks the chain
> immediately.

I think that's a bad thing! For the same reason that we use -Werror:
where possible, we can let GCC enforce consistency within our source
base. Use of gdb_byte (as unsigned char) buys you the advantage that
any other pointer type won't silently convert to it.

If you want to use a standard type, play the necessary autoconf games
to acquire stdint.h. Use uint8_t *.

--
Daniel Jacobowitz
CodeSourcery, LLC