Date: Mon, 13 Feb 2006 10:48:02 +0200 From: Giorgos Keramidas <keramida@ceid.upatras.gr> To: Colin Percival <cperciva@freebsd.org> Cc: arch@freebsd.org, stefanf@freebsd.org, des@des.no Subject: Re: [releng_6 tinderbox] failure on sparc64/sparc64 Message-ID: <20060213084802.GA53779@flame.pc> In-Reply-To: <43F04494.4030900@freebsd.org> References: <20060205084813.GN21806@wombat.fafoe.narf.at> <867j89n71d.fsf@xps.des.no> <20060205220211.GA5151@falcon.midgard.homeip.net> <20060213.002310.125802352.imp@bsdimp.com> <20060213082129.GA13997@flame.pc> <43F04494.4030900@freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On 2006-02-13 00:34, Colin Percival <cperciva@freebsd.org> wrote: >Giorgos Keramidas wrote: >> On 2006-02-13 00:23, "M. Warner Losh" <imp@bsdimp.com> wrote: >>> struct foo foo; >>> uint32_t value[sizeof(foo) / sizeof(uint32_t)]; >>> >>> memcpy(value, &foo); >>> // write out value one 32-bit word at a time >>> >>> Is that right? Or at least 'proper' here means defined. >> >> AFAIK, yes. > > I agree that the behaviour of the above code is defined, but > I'd be much happier if value[] was defined to be an array of > length ((sizeof(foo) - 1) / sizeof(uint32_t) + 1), just in > case sizeof(foo) happens to not be a multiple of 4. :-) Good thinking. It's probably a good idea to avoid copying random garbage, and using something like: struct foo foo; uint32_t value[sizeof(uint32_t) * (sizeof(foo) / sizeof(uint32_t) + 1)]; and then copying only sizeof(foo) bytes. This is probably defined too and won't allow overflowing of value[], but I don't really want to know what it does on machines of varying endianess :-) - Giorgos
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20060213084802.GA53779>