From owner-freebsd-arch@FreeBSD.ORG Mon Feb 13 08:23:49 2006 Return-Path: X-Original-To: arch@freebsd.org Delivered-To: freebsd-arch@FreeBSD.ORG Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 6DCAC16A420; Mon, 13 Feb 2006 08:23:49 +0000 (GMT) (envelope-from keramida@ceid.upatras.gr) Received: from igloo.linux.gr (igloo.linux.gr [62.1.205.36]) by mx1.FreeBSD.org (Postfix) with ESMTP id 9B2E243D48; Mon, 13 Feb 2006 08:23:48 +0000 (GMT) (envelope-from keramida@ceid.upatras.gr) Received: from flame.pc (aris.bedc.ondsl.gr [62.103.39.226]) (authenticated bits=128) by igloo.linux.gr (8.13.5/8.13.5/Debian-3) with ESMTP id k1D8Lkbk025024 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT); Mon, 13 Feb 2006 10:21:48 +0200 Received: from flame.pc (flame [127.0.0.1]) by flame.pc (8.13.4/8.13.4) with ESMTP id k1D8Lff5016649; Mon, 13 Feb 2006 10:21:41 +0200 (EET) (envelope-from keramida@ceid.upatras.gr) Received: (from keramida@localhost) by flame.pc (8.13.4/8.13.4/Submit) id k1D8LU07016608; Mon, 13 Feb 2006 10:21:30 +0200 (EET) (envelope-from keramida@ceid.upatras.gr) Date: Mon, 13 Feb 2006 10:21:29 +0200 From: Giorgos Keramidas To: "M. Warner Losh" Message-ID: <20060213082129.GA13997@flame.pc> References: <20060205084813.GN21806@wombat.fafoe.narf.at> <867j89n71d.fsf@xps.des.no> <20060205220211.GA5151@falcon.midgard.homeip.net> <20060213.002310.125802352.imp@bsdimp.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20060213.002310.125802352.imp@bsdimp.com> X-Hellug-MailScanner: Found to be clean X-Hellug-MailScanner-SpamCheck: not spam, SpamAssassin (score=-3.353, required 5, autolearn=not spam, ALL_TRUSTED -1.80, AWL 0.85, BAYES_00 -2.60, DNS_FROM_RFC_ABUSE 0.20) X-Hellug-MailScanner-From: keramida@ceid.upatras.gr Cc: arch@freebsd.org, stefanf@freebsd.org, des@des.no Subject: Re: [releng_6 tinderbox] failure on sparc64/sparc64 X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 13 Feb 2006 08:23:49 -0000 On 2006-02-13 00:23, "M. Warner Losh" wrote: > In message: <20060205220211.GA5151@falcon.midgard.homeip.net> > Erik Trulsson writes: > : On Sun, Feb 05, 2006 at 04:45:34PM +0100, Dag-Erling Sm?rgrav wrote: > : > Stefan Farfeleder writes: > : > > On Sat, Feb 04, 2006 at 03:58:56PM -0700, M. Warner Losh wrote: > : > > > This driver wants to access these structures as arrays of uint32_t. > : > > > It used to cast directly, but that isn't allowed. So, I've passed > : > > > the cast through a (void *). Is that allowed? Eg: > : > > > > : > > > struct foo foo; > : > > > ((uint32_t *)(void *)&foo)[3] = 12; > : > > > > : > > > is that OK? > : > > I'm afraid that only silences the warning without solving the underlying > : > > problem. I don't think there's a Standard conforming way to treat a > : > > struct foo as an uint32_t array. > : > > : > A union should do the trick. > : > : No, it will not. If you have a struct foo and try to access it as an array > : of int, the program will have unspecified (and maybe even undefined) > : behaviour. It does not matter if you do it with a union or by casting > : pointers. > : > : In general, if you have an object of type X, then the only ways it can be > : accessed is either as an object of type X, or as an array of [unsigned] > : char. > > So the proper fix for the above code is: > > 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.