svn commit: r212886 - head/sbin/growfs

Marcel Moolenaar xcllnt at mac.com
Mon Sep 20 16:10:08 UTC 2010


On Sep 19, 2010, at 11:55 PM, Bruce Evans wrote:

> On Mon, 20 Sep 2010, Marcel Moolenaar wrote:
> 
>> Log:
>> Unbreak the build on strong-aligned architectures (arm, ia64).
>> Casting from (char *) to (struct ufs1_dinode *) changes the
>> alignment requirement of the pointer and GCC does not know that
>> the pointer is adequately aligned (due to malloc(3)), and warns
>> about it. Cast to (void *) first to by-pass the check.
> 
> A previous version in which the pointer (iobuf) the correct type to
> begin with was better.  It used to have type void *, but now has type
> caddr_t (whose existence is a bug), in order to abuse caddr_t by
> assuming that it is char * to do pointer arithmetic on it in 1 place
> (iobuf + sblock.fs_cgsize).  The 7 other places where iobuf is used
> only assume that caddr_t is a pointer (or perhaps a [u]intptr_t).
> 
> growfs has no other instances of caddr_t.

My first instinct was to retype iobuf as (void *), but saw
the pointer arithmetic and decided against it. If we had
a macro that one can use to add X number of bytes to a pointer
to any, I would have used that. Other macros to add X number
of short, int, long, could be handy too, but that may not be
as useful as for bytes.

Would it be useful to add a macro like (don't mind the name):

#define ADDBYTESTOPOINTER(ptr, cnt)	\
	((__typeof(ptr))(void *)((uintptr_t)(void *)(ptr) + (cnt)))

?

-- 
Marcel Moolenaar
xcllnt at mac.com





More information about the svn-src-head mailing list