do ... while(0) optimization problem

Mike Frysinger vapier at gentoo.org
Sun Jan 6 10:14:18 PST 2008


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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 835 bytes
Desc: This is a digitally signed message part.
Url : http://busybox.net/lists/busybox/attachments/20080106/ec5215b7/attachment.pgp 


More information about the busybox mailing list