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
> -mike

    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.

      Loïc Grenié
_______________________________________________
busybox mailing list
[email protected]
http://busybox.net/cgi-bin/mailman/listinfo/busybox

Reply via email to