On Sunday 06 January 2008, Loïc Grenié wrote:
> 2008/1/6, Mike Frysinger <[EMAIL PROTECTED]>:
> > On Sunday 06 January 2008, Detlef Vollmann wrote:
> > > in util-linux/fdisk.c, the macro
> > >
> > > #define INIT_G() do { \
> > > PTR_TO_GLOBALS = xzalloc(sizeof(G)); \
> > > sector_size = DEFAULT_SECTOR_SIZE; \
> > > sector_offset = 1; \
> > > g_partitions = 4; \
> > > display_in_cyl_units = 1; \
> > > units_per_sector = 1; \
> > > } while (0)
> > >
> > > seems to get partly optimized away in my gcc (GCC) 3.2.2.
> > > I get a segmentation fault and it turns out that ptr_to_globals is 0.
> >
> > so fix your gcc ? the point of do { ... } while (0) is to provide proper
> > wrapping context that can be used anywhere that a single statement can.
> > sane gcc will expand all of the code within without the do/while part
> > because it's a nop.
> >
> > > Rewriting the macro to
> > >
> > > #define INIT_G() ( \
> > > PTR_TO_GLOBALS = xzalloc(sizeof(G)), \
> > > sector_size = DEFAULT_SECTOR_SIZE, \
> > > sector_offset = 1, \
> > > g_partitions = 4, \
> > > display_in_cyl_units = 1, \
> > > units_per_sector = 1)
> > >
> > > works fine...
> >
> > you could always compare the disassembly output, but considering how
> > ancient your gcc is, that sounds like a waste of time
>
> You can also rewrite the macro
>
> do {
> statements;
> break;
> } while(1)
>
> Ancient SunOS' cc's are known to break the do { } while(0); construct.
> It does not break the preceeding one. I don't remember anything about
> gcc though.that'd be interesting to see if it makes a difference here ... but considering the common convention is (0) and the target busybox environment is not old/busted SunOS, i dont think we should be catering to busted compilers. -mike
signature.asc
Description: This is a digitally signed message part.
_______________________________________________ busybox mailing list [email protected] http://busybox.net/cgi-bin/mailman/listinfo/busybox
