[current tinderbox] failure on ...all...

Ruslan Ermilov ru at freebsd.org
Fri Jun 10 11:02:30 GMT 2005


On Fri, Jun 10, 2005 at 01:28:13PM +0300, Giorgos Keramidas wrote:
> On 2005-06-10 12:46, Ruslan Ermilov <ru at 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 at gmail.com> writes:
> >>>> Dag-Erling Sm?rgrav <des at 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).
> 
And if both modules use the same t1 but compiled with different alignment
options, the memcpy() in module.c won't work either, even a simple assignment
could break.  :-)


Cheers,
-- 
Ruslan Ermilov
ru at FreeBSD.org
FreeBSD committer
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-current/attachments/20050610/51984835/attachment.bin


More information about the freebsd-current mailing list