Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 10 Jun 2005 13:28:13 +0300
From:      Giorgos Keramidas <keramida@freebsd.org>
To:        Ruslan Ermilov <ru@freebsd.org>
Cc:        Dag-Erling Sm?rgrav <des@des.no>, freebsd-current@freebsd.org
Subject:   Re: [current tinderbox] failure on ...all...
Message-ID:  <20050610102813.GA81548@orion.daedalusnetworks.priv>
In-Reply-To: <20050610094615.GC79474@ip.net.ua>
References:  <20050609234619.AD1F67306E@freebsd-current.sentex.ca> <p0621025fbeceac0673f8@128.113.24.47> <84dead720506091950779d1661@mail.gmail.com> <86oeae3d8f.fsf@xps.des.no> <84dead72050610001675a32c19@mail.gmail.com> <863brq3bbz.fsf@xps.des.no> <84dead7205061001534b9385b3@mail.gmail.com> <863brqy41j.fsf@xps.des.no> <20050610091624.GA35628@wombat.fafoe.narf.at> <20050610094615.GC79474@ip.net.ua>

next in thread | previous in thread | raw e-mail | index | archive | help
On 2005-06-10 12:46, Ruslan Ermilov <ru@freebsd.org> wrote:
>On Fri, Jun 10, 2005 at 11:16:27AM +0200, Stefan Farfeleder wrote:
>>On Fri, Jun 10, 2005 at 11:06:16AM +0200, Dag-Erling Sm?rgrav wrote:
>>>Joseph Koshy <joseph.koshy@gmail.com> writes:
>>>> Dag-Erling Sm?rgrav <des@des.no> writes:
>>>> > It also seems strange to me that you on the one hand introduce a
>>>> > new struct to separate MD and MI interfaces, and on the other hand
>>>> > continue to assume that they are assignment-compatible.
>>>> I'd be very surprised if two C structures with identical definitions
>>>> were not assignment compatible.
>>>
>>> I wouldn't be surprised if the standard says they aren't.
>>> Unfortunately, my copy is at home.
>>
>> Do you mean the following?
>>
>> struct t1 { int a; } x;
>> struct t2 { int a; } y = { 42 };
>> x = y;
>>
>> The types `struct t1' and `struct t2' are not compatible and thus not
>> assignable.  See 6.2.7 and 6.5.16.1.
>
> If you're to byte-copy say t1 to t2, is it guaranteed to work?  That
> is, do both types are guaranteed to have the same size and alignment
> of their structure members?  I'm pretty sure this is guaranteed, as
> lot of code assumes this, for example, the sockaddr* structures.

That would be very hard to guarantee if two different modules that use
the types are compiled with different alignment options, right?

	/* header1.h */
	struct t1 {short t1s; int t1a;};

	/* header2.h */
	struct t2 {short t2s; int t2a;};

	/* module1.c */
	#include "header1.h"
	struct t1 x;

	/* module2.c */
	#include "header1.h"
	#include "header2.h"
	extern struct t1 x;
	struct t2 y;

If the two modules are compiled with different options that may affect
struct member alignment, how would one ensure that it is correct to
use code like this in module.c?

	y.t2s = 10;
	y.t2a = 100;
	memcpy(&x, &y, sizeof(x));

Even the use of sizeof(x) is tricky here, since there is no guarantee
that sizeof(x) < sizeof(y).





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20050610102813.GA81548>