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

From: Ruslan Ermilov (ru_at_freebsd.org)
Date: 06/10/05

  • Next message: Giorgos Keramidas: "Re: [current tinderbox] failure on ...all..."
    Date: Fri, 10 Jun 2005 14:02:55 +0300
    To: Giorgos Keramidas <keramida@freebsd.org>
    
    
    

    On Fri, Jun 10, 2005 at 01:28:13PM +0300, Giorgos Keramidas wrote:
    > 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).
    >
    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@FreeBSD.org
    FreeBSD committer
    
    



  • Next message: Giorgos Keramidas: "Re: [current tinderbox] failure on ...all..."

    Relevant Pages